![]() |
MsgWaitForMultipleObjects vs WaitForMultipleObjects
Hi Leute,
folgende Situation : Ich habe einen Arbeiter-Thread der Daten die in einem TList Object gespeichert werden, sequentiel abgearbeitet werden. Das TList-Object schütze ich mit einer CriticalSection ! In meinem OnExecute Ereigniss des Threads warte ich mit im Moment MsgWaitForMultipleObjects auf zwei Events : CloseEvent --> der Threads soll beendet werden WorkEvent --> Es sind Daten in die Verarbeitungsschleife eingestellt worden. Die abgearbeitet werden müssen. Jetzt habe ich in der Windows Api Hilfe von Delphi folgenden Satz zu MsgWaitForMultipleObjects gefunden : Zitat:
Meine Events erzeuge ich im Moment mit :
Code:
Jetzt habe diverse andere Threads die Nachrichten für diesen Thread Nachrichten zur Verarbeitung einstellen.
// Zweiter Parameter = false ---> Auto-Reset des Events
hCloseEvent := CreateEvent(nil, False, False, 'EndmyWorkerThread'); Nach der Einstellung der Nachricht,signalisieren die Threads das WorkEvent. Jetzt habe ich festgestellt das im "Schlimmsten Falle" zwei oder mehr Threads gleichzeitig den WorkEvent signalisieren, obwohl das auch über syncronize geschieht. Das Problem ist jetzt zwei Threads stellen eine Nachricht ein, der erste Thread signalisiert das WorkEvent, der Arbeiter-Thread fängt an die Nachricht abzuarbeiten, während der Arbeiter-Thread arbeitet signalisiert der zweite Thread ebenfalls das OnWork Event. Jetzt ist der Arbeiter-Thread mit seiner Verarbeitung fertig, und wartet wieder auf das nächste OnWork-Event. Dieses tritt aber nicht ein, da anscheinend das OnWork-Event von Thread 2 verworfen wurde und nicht im Message queue erhalten bleibt. Was mache ich jetzt um diese Situation zu umgehen ? Hilft die Verwendung von WaitForMultipleObjects anstatt MsgWaitForMultipleObjects ? Oder könnte es helfen die Events nicht automatisch zu reseten, sondern dies mit ResetEvent zu tun ? Ich hoffe ich konnte das Problem verständlich ausdrücken *g Gruß DAta |
Re: MsgWaitForMultipleObjects vs WaitForMultipleObjects
MsgWaitForMultipleObjects() hat einzig den Vorteil, daß man "entweder oder" auf Fensternachrichten und Ereignisse (Handles) warten kann. Die andere Funktion wartet nicht auf Nachrichten.
Auf diese Nachrichten wird mit "Input" im oben zitierten Text hingewiesen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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