Guten Morgen,
also nochmal grob erklärt und zusammengefasst:
Es sind ca 35 UDP Teilnehmer an der Anwendung angemeldet (die Anwendung ist ein UDP Server und empfängt die Daten im OnUDPRead Event der
Indy Komponente). Jeder UDP Teilnehmer ist ein eigener Thread da dieser losgelöst kommunizieren kann von den anderen.
Meine Threadinstanz, wo ich das Problem mit der Zeitmessung habe, bekommt die Daten von dem jeweiligen UDP Thread geschickt via "PostThreadMessage".
Diese Threadinstanz (existiert also auch 35x, da 35 UDP Teilnehmer online sind), empfängt die Daten in ihrer ThreadQueue grob durch folgenden Aufruf:
Delphi-Quellcode:
while not Terminated do
begin
//hier erfolgt eine Signalisierung über WaitForSingleObject und bei Timeout (=250ms), erfolgt der zyklische Aufruf unten
if WaitForsingleObject(Irgendwas, 250, xxxx) = WAIT_OBJECT_0 do
begin
end;
//zyklischer Aufruf
var sw := TStopwatch.StartNew;
var TC : DWORD;
TC := GetTickCount;
//Synchronize(MeineFunktion);
//Queue(Nil, MeineFunktion);
//ForceQueue(Nil, MeineFunktion);
t1 := sw.ElapsedMilliseconds;
//Protokollierung von t1 ...
TC2 := GetTickCount - TC;
//Protokollierung von TC2 ...
end;
Die Protokollierung der Zeitmessung sowohl von t1 als auch TC2, schlägt zu. Egal welcher der 3 Aufrufe genutzt wird.
Eine Prüfung vorher auf
if (MainThreadID <> GetCurrentThreadID) then
zeigt auch, dass es nicht der
VCL Thread ist als Aufrufer.
Die Protokollierung innerhalb der Funktion "MeineFunktion" schlägt nicht zu.
Ich muss weitere Untersuchungen anstellen, da auch ein Ausklammern der Funktion "MeineFunktion" dazu führt, dass die
VCL hängt. Synchronize Aufrufe habe ich keine mehr im Programm. Ich muss prüfen, wer die
VCL blockiert. Eurekalog habe ich schon mal installiert aber bei HangDetection wurde mir nichts angezeigt bzw. wann wird da wo was angezeigt? In dem Moment wo die Anwendung hängt oder beim Beenden?