Skocz do zawartości


Zdjęcie

[Delphi] Zmiana Statusu, AV , Wątek, Thread


  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 Lorkan

Lorkan

    Początkujący

  • Użytkownik
  • 8 postów

Napisano 2009.02.15, 13:35

Witajcie dzisiaj przychodzę do was z takim problemem :) Chciałem by moja wtyczka zmieniała opis co określony czas i postanowiłem zrobić to w osobnym wątku (i bardzo dobrze wiem :P ) , jednak nie wiem czemu otrzymuje AV przy kolejnej iteracji pętli w wątku... nawet wiem która linia powoduje AV tylko nie wiem czemu, zmieniłem ją na komentarz "//", szukajcie jej w TWatek.Execute . Może wy mi pomożecie bo ja juz obczytałem fora i pomysłu nie mam.

być może chodzi o odwołanie sie do zmiennych globalnych z biblioteki, ale nie wiem jak to wyminąć.

library Lorika;uses  Windows,  SysUtils,  Classes,  Dialogs,  System,  Unit1 in 'Unit1.pas',  PluginAPI in 'PluginAPI.pas';type  TWatek = class(TThread)  protected    procedure Execute; override;  end;var  PluginInfo: TPluginInfo;  PluginLink: TPluginLink;  path: String;  Watek : TWatek;  Tpcs: TPluginStateChange;  Ppcs: PPluginStateChange;  frame : array[1..5] of WideString;const  PLUGIN_SHORTNAME = 'Lorika';{$R *.res}//Hooksfunction OnModulesLoad(wParam, lParam: DWord): Integer; stdcall; forward;procedure TWatek.Execute;var i:Integer;begin  FreeOnTerminate := True;  repeat  for i:=1 to 5 do  begin  Sleep(3000);  PluginLink.CallService(AQQ_FUNCTION_GETNETWORKSTATE,Cardinal(Ppcs),0);  Tpcs.Force:=TRUE;  Tpcs.ByHand:=TRUE;  Tpcs.Status:=PWideChar(frame[i]);  //PluginLink.CallService(AQQ_SYSTEM_SETSHOWANDSTATUS,0,Cardinal(Ppcs));  end;  Sleep(40000);  until Watek.Terminated;end;procedure getSlajds;var  TF : TextFile;  C : Char;  ss,i:integer;begin  path := PWideChar(PluginLink.CallService(AQQ_FUNCTION_GETPLUGINUSERDIR,hInstance ,0));  for i:=1 to 5 do  begin  frame[i]:='';  AssignFile(TF, path+'\Lorika\s'+IntToStr(i)+'.txt');  try  Reset(TF);  ss:=0;  while (not Eof(TF)) and (ss<70)do  begin    Read(TF, C);    frame[i]:=frame[i]+C;    ss:=ss+1;  end;  finally  CloseFile(TF);  end;  end;end;function Load(Link: PPluginLink): Integer; stdcall;begin  PluginLink := Link^;  PluginLink.HookEvent(AQQ_SYSTEM_MODULESLOADED, OnModulesLoad);  Ppcs:=@Tpcs;  getSlajds;  Watek := TWatek.Create(True);  Watek.Resume;  Result:=0;end;function AQQPluginInfo(AQQVersion: DWord): PPluginInfo; stdcall;begin  PluginInfo.cbSize := SizeOf(TPluginInfo);  PluginInfo.ShortName := PLUGIN_SHORTNAME;  PluginInfo.Version := PLUGIN_MAKE_VERSION(1,0,0,0);  PluginInfo.Description := '';  PluginInfo.Author := '';  PluginInfo.AuthorMail := '';  PluginInfo.Copyright := '';  PluginInfo.Homepage := '';  PluginInfo.Flag := 0;  PluginInfo.ReplaceDefaultModule := 0;  Result := @PluginInfo;end;function Settings: Integer; stdcall;begin  Result := 0;  path := PWideChar(PluginLink.CallService(AQQ_FUNCTION_GETPLUGINUSERDIR,hInstance ,0));  if not Assigned(Form1) then    begin      Form1 := TForm1.Create(nil);    end;  Form1.setThemePath(path);  Form1.ShowModal;  FreeAndNil(Form1);end;function Unload: Integer; stdcall;begin  Result := 0;  PluginLink.UnhookEvent(THandle(@OnModulesLoad));  if Assigned(Form1) then FreeandNil(Form1);end;function OnModulesLoad(wParam{0},lParam{0}:DWord): Integer; stdcall;begin  Result := 0;end;exports  Load,  Unload,  AQQPluginInfo,  Settings;beginend.


#2 Dibo

Dibo

    Bywalec

  • Wtyczkopisarz
  • 202 postów

Napisano 2009.02.15, 16:08

Po pierwsze nie wiem czy wątek to dobry pomysł. Z wątkami to trzeba ostrożnie, w zupełności wystarczy jakiś timerek. Po drugie nie wiem co robisz ze zmienną tpcs, w TWatek.Execute ustawiasz jej jakieś wartości ale nigdzie nie posyłasz. Spróbuj tak:

frame : array[1..5] of WideString; zamień na: frame : array[1..5] of String; i potem:

procedure TWatek.Execute;
var
 i:Integer;
 a_PSC: PPluginStateChange;
begin
  FreeOnTerminate := True;
  repeat
  for i:=1 to 5 do
  begin
	Sleep(3000);
	New(a_PSC);
	try
	  ZeroMemory(a_PSC, SizeOf(a_PSC));
	  PluginLink.CallService(AQQ_FUNCTION_GETNETWORKSTATE,DWORD(a_PSC),0);
	  a_PSC.Force:=TRUE;
	  a_PSC.ByHand:=TRUE;
	  a_PSC.Status:=PWideChar(WideString(frame[i]));
	  //zakładam że ta funkcja zmienia status bo nigdy jej nie używałem
	  PluginLink.CallService(AQQ_SYSTEM_SETSHOWANDSTATUS,0,DWORD(a_PSC));
	finally
	  Dispose(a_PSC);
	end;
  end;
  Sleep(40000);
  until Watek.Terminated;
end;

Po za tym nie widze nigdzie Terminate dla wątka co doprowadza pewnie do wycieku pamięci. Naprawdę zrezygnuj z niego i spróbuj z timerkiem

#3 Kendziooor

Kendziooor

    Pan Majster

  • Wtyczkopisarz
  • 1076 postów

Napisano 2009.02.15, 16:31

Nie wspomnę, że podłączasz się do notyfikacji OnModulesLoaded, a nic w niej nie robisz...
Dołączona grafika
Całkiem nowa wersja notatnika do AQQ! Zostań beta-testerem!

System: Windows7 Home Premium; IE8 + Opera 10 (domyślna); Ad-Aware Pro Internet Security 8
Komunikator: Wtyczki podstawowe + dodatkowe; Kompozycja Satin




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych