Dobrý den,
kód nemohu ukázat protože je to hodně obsáhlý kód a to důležité je rozseté po unitech a to jsem ukázal v prvním příspěvku. Zkusím to vysvětlit jinak:
1) Každý class (TThread) má privátní Event. Tento class vytvořím 3x, takže vzniknou tři vlákna pomocí, kdy každý má vlastní event
Event := CreateEvent(nil, False, False, nil);
s handle například 800, 801 a 802.
2) Execute každého z vláken čeká na svůj vlastní event pomocí
WaitForSingleObject(Event, Timeout)
... domnívám se, že toto je poměrně jasné.
Při zavírání aplikace mám toto:
Thread1.Free;
Thread2.Free;
Thread3.Free;
Každý destruktor vlákna zavolá vlastní event přes:
SetEvent(Event);
Self.WaitFor;
CloseHandle(Event);
Při trasování se na Thread1.Free; vyvolá SetEvent pouze Eventu s handlem 800. Následně ale všechny vlákna padnou do
WAIT_OBJECT_0 části. Takže když se pak debuger posune na Thread2.Free; tak to vlákno je již terminované. Stejně pak i Thread3.Free;
Domníval jsem se, že Event se rozlišuje podle handle, které by mělo být unikátní. Ale vypadá to, že WaitForSingleObject vrátí WAIT_OBJECT_0 při jakémkoli SetEvent události.
Napadlo mě, zda se ty privátní Eventy nepletou. Kód
Event := CreateEvent(nil, False, False, nil);
nabízí možnost Event pojmenovat. Když je nil, nemůže pak docházet k výše uvedenému problému?
Děkuji.