![]() |
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Dazu eine Idee? |
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Also...
Hier gibt es ja schon viele Fragen und Antworten... Aber. Zitat:
Das ist natürlich der klassische Fehler für die Verwendung eines Threads (Übrings genau das behandle ich in meinem ![]() In einem Thread Queue aufzurufen ist natürlich nicht das Problem, aber nur um "Kleinigkeiten" auf der UI darzustellen. Die eigentliche Verarbeitung muss im Thread passieren. WaitForsingleObject kann man nehmen, aber ich würde ein TEvent verwenden. Da der Server ja immer nur eine Datenpacket nach dem anderen Empfängt würde ich die Aufgabe nicht an N-Thread pro N-Client weiter geben sondern das Datenpacket in eine Threadsichere Quere packen, die von X-Threads abgearbeitet werden. Nur so ein paar gedanken. Mavarik :coder: |
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Danke für die Tips.
Das WaitForsingleObject war ja ein Fehler, es wird ja so gemacht:
Delphi-Quellcode:
Das ist aber nur der Thread, der die Daten am Ende verarbeitet. Nicht der UDP Empfang oder Sender Thread...
while not Terminated do
begin Return := MsgWaitForMultipleObjects (Handles, HandleBuffer, False, 251, QS_ALLINPUT); //case Return do //WAIT_OBJECT_0 //WAIT_OBJECT_0+Handles // : begin // while PeekMessage(MessageData, 0, 0, 0, PM_REMOVE) do // begin // Mach irgendwas mit der Nachricht... // end; // end; //WAIT_TIMEOUT //end; //zyklischer Aufruf var sw := TStopwatch.StartNew; var TC : DWORD; var TC2 : DWORD; TC := GetTickCount; //Synchronize(MeineFunktion); //Queue(Nil, MeineFunktion); //ForceQueue(Nil, MeineFunktion); t1 := sw.ElapsedMilliseconds; //Protokollierung von t1 ... TC2 := GetTickCount - TC; //Protokollierung von TC2 ... end ; Hat jemand mal ein Beispiel für Daten, die in eine Threadliste von einem Thread X geschrieben werden und von einem Thread y gelesen werden? Ich möchte aber den Thread y auch per Message oder Event über bestimmte Dinge informieren können von außen. Also ein Beispiel mit threadsichere Queue/Liste UND Event. Dann kann ich das gerne mal versuchen, habe damit noch nichts zu tun gehabt |
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Ich kann es aus dem Code zwar nicht direkt ersehen, aber das MsgWaitXXX wartet vermutlich auf den/die Thread(s), die im weiteren Verlauf mit PostThreadMessage beliefert werden sollen. Das wird in der MS-Doku auch genauso beschrieben.
Aber trotz aller oft sicher auch berechtigter Kritik: Das Problem ist offenbar nicht in dem gezeigten Code zu finden. Das Kappen einer größeren Menge von Verbindungen und das daraus folgende Terminieren der Threads ist nicht die Ursache für das Hängen der VCL. Vielmehr löst es diese nur aus. Es geht also darum, die Ursache für den Hänger zu finden. Den Auslöser kennen wir nun ja schon. |
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Zitat:
Warum sollte ein PostThreadMessage von jemand anderen (von außen) an genau diesen Thread, zu einem warten führen? Das ist mir nicht ganz klar. Zitat:
|
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Zitat:
![]() Zitat:
Zitat:
|
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Zitat:
Zitat:
Würde gerne nochmal darauf zurück kommen: Zitat:
|
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Zitat:
Hat keinen Effekt auf die VCL. Hätte mich auch gewundert, da alles was mit Logging zu tun hat, an einen zentralen Log-Thread per PostThreadMessage geschickt wird und der liest entsprechend auch seine Queue aus und schreibt dann in die Datei. Muss also noch was anderes sein... |
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Zitat:
|
AW: Thread.Queue, Zeitmessung, Thread hängt angeblich
Zitat:
Zeigt doch einfach mal den Quellcode, mit dem die UDPClients gleichzeitig getrennt werden. Hier scheint ja das Problem zu liegen. Eventuell macht der VCL-Thread in der Zeit ja garnichts, sondern wird von Windows erst wieder an die Arbeit gelassen, wenn alle UDPClients beendet sind? Mögliche blockierende Freigabeoperationen(?): Socket-Cleanup bei UDP-Clients erfolgt synchron im Hauptthread? Massenhafte Freigabe (35 Clients) blockiert die Nachrichtenverarbeitung? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz