[Delphi] Działający wątek i zamykanie programu

0

Witam

Wiele aplikacji po zamknięciu działa jeszcze w tle, tzn. okno się zamyka, ale w oknie procesów widać jak coś robi - np. zapisuje dane (tak mi się wydaje :) ).

W trakcie działania programu wywołuje kilka wątków i chciałbym żeby działały one do momentu, aż skończą swoją robotę. Nawet w przypadku, gdy użytkownik postanowi zamknąć program w momencie ich działania.

Moje pytanie zatem brzmi jak to zrobić ?

Pozdrawiam wszystkich z 4p

0
  1. każdemu wątkowi przypisz zmienną ustawianąną w jakiś stan po jego zakończeniu. w pliku .dpr po linii application.run wklep pętlę czekającą aż wszystkie zmienne zostaną odpowiednio ustawione.
    lub
  2. w .dpr daj po application.run waitformultipleobjects, a w parametrach podaj uchwyty do stworzonych wątków.
0

Jak mam podać uchwyt wątku ?

Może podam kod jak to mam zrobione i co próbuje uzyskać :)

type
unit FileDelete
  TFileDel = class(TThread)
  ... //wszystko inne jest
  end;

procedure TFileDel.Execute;
begin
  FreeOnTerminate;
  ...
end;

var File_Delete: TFileDel;  //w głównym module wywołuje wątek w jakiejś procedurze
    File_Delete := TFileDel.Create(...);
    File_Delete.Resume;

//w *.dpr dodałem do uses Windows
  WaitForMultipleObjects(1, //i tu nie wiem jak podać uchwyt
     False, INFINITE);   //albo jak tego użyć :(
0

File_Delete.Handle;

0

Tak robiłem tylko pojawiał się komunikat błędu niekompatybilne typy..

Poszło w takiej formie:

WaitForMultipleObjects(1, PWOHandleArray(MainFrm.File_Delete.Handle), False, INFINITE); 

, ale chyba nie tędy droga. Gdy wątek działa, a ja zamykam program wyskakuje Access Volation z Kernela32. :(

Znalazłem to: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waiting_for_multiple_objects.asp i próbuje na podstawie tego, ale brak mi już pomysłów. Przecież tablica hEvents[2] jest typu HANDLE [???]

0

handle to 32bitowa liczba, więc możesz dać choćby i inta. tylko że tu chodzi o coś kompletnie innego: uchwyt, a pointer do tablicy uchwytów, to dwie różne bajki. nie możesz rzutować uchwytu na pointer, i to w dodatku do tablicy! uchwyt to nie pointer. powinieneś sprawdzić na msdn (albo w delphi przez windows sdk) co za parametry ma ta funkcja, a potem trochę pomyśleć.
wyszło by Ci coś takiego:
WaitForMultipleObjects(1,@wątek.handle,true,1000*10);

ale to i tak nie ma sensu, bo czekanie na jeden wątek za pomocą waitformultipleobjects cokolwiek mija się z celem - chyba łatwiej będzie z waitforsingleobject, nie sądzisz? ;]

btw:

tablica hEvents[2] jest typu HANDLE
tablica jest typu tablica (czegoś), więc co najwyżej może być mowa o tablicy uchwytów.

0

Wpisując tak

WaitForSingleObject(MainFrm.File_Delete.Handle, INFINITE);

, wyskakuje mi błąd jeżeli wątku nie wywołam wcześniej w programie. Jeżeli wywołam ten wątek to już działa - dałem jako parametr INFINITE.

Ale problem jest jak wątku nie ma ? CO z tym zrobić ?

0
drumers napisał(a)

Ale problem jest jak wątku nie ma ? CO z tym zrobić ?

Po prostu nie wywołujesz WaitForSingleObject. I tyle ;)

PS. Pamietaj o wyNULLowaniu nie używanych uchwytów - ustrzeże cię przed tego typu błędami.

0
drumers napisał(a)

Wpisując tak

WaitForSingleObject(MainFrm.File_Delete.Handle, INFINITE);

, wyskakuje mi błąd jeżeli wątku nie wywołam wcześniej w programie. Jeżeli wywołam ten wątek to już działa - dałem jako parametr INFINITE.

Ale problem jest jak wątku nie ma ? CO z tym zrobić ?

[rotfl] no wiesz, ciężko jest czekać na wątek, który nie istnieje. sprawdź przed czekaniem, czy aby na pewno zmienna od wątku <> nil i czy uchwyt wątku <> 0.

0

Dzięki, działa tak jak powinno :)

//w *.dpr
uses Windows, MainFrm;

if MainFrm.File_Delete <> nil then
    WaitForSingleObject(MainFrm.File_Delete.Handle, INFINITE);

//i gdzieś w unicie formy MainFrm
var File_Delete: TFileDel;   

  File_Delete := TFileDel.Create(...);  
  File_Delete.Resume;

//unit wątku
unit FileDelete

  TFileDel = class(TThread)
  ... //metody
  end;

procedure TFileDel.Execute;
begin
  FreeOnTerminate;
  ...
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1