Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

MsgWaitForMultipleObjects vs WaitForMultipleObjects

  Alt 12. Dez 2003, 14:39
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:
Note that MsgWaitForMultipleObjects doesn't return if there was previously unread input of the specified type in the queue. It only wakes up when input arrives.
Zu WaitForMultipleObjects ist dieser Hinweis nicht vorhanden !

Meine Events erzeuge ich im Moment mit :
Code:
  // Zweiter Parameter = false ---> Auto-Reset des Events
  hCloseEvent := CreateEvent(nil, False, False, 'EndmyWorkerThread');
Jetzt habe diverse andere Threads die Nachrichten für diesen Thread Nachrichten zur Verarbeitung einstellen.
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat