![]() |
WaitForMultipleObjects - Fehler durch zu frühes FindNext?
Hi!
der folgende Code läuft in einem Thread. Leider hängt der sich irgendwann auf. Kann es daran liegen, dass ich für alle Handles des FHandleArrays in der for-Schleife FindNextChangeNotification aufrufe, obwohl nur ein einziger Handle wirklich zurückgekehrt ist? Das heißt zum Zeitpunkt 1ms meldet ein Handle WAIT_OBJECT_0, jetzt arbeite ich den weiteren Code ab und fordere die nächste Notification an, obwohl insgesamt noch keine 500 ms verstrichen sind. Oder wie kann man sich den Ablauf vorstellen? Hat jemand Ideen?
Delphi-Quellcode:
Hier der komplette Code:
while not Terminated and (Length(FHandleArray) > 0) do
begin FWaitStatus := WaitForMultipleObjects(Length(FHandleArray), @FHandleArray[0], False, 500); if FWaitStatus = WAIT_FAILED then Exit; if (FWaitStatus >= WAIT_OBJECT_0) and (FWaitStatus <= High(FHandleArray)) then Synchronize(ExecuteOnChange); for I := 0 to High(FHandleArray) do FindNextChangeNotification(FHandleArray[I]); end; ![]() Danke!! Grüße Sebastian |
Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
Zitat:
Der Index des Events ist im Rückgabewert kodiert - deswegen sollte das Array nicht größer sein als 0..MAXIMUM_WAIT_OBJECTS-1 (sagte/schrieb ich ja schon :)) |
Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
weshalb ersetzt Du nicht einfach die Zeile
Delphi-Quellcode:
durch
for I := 0 to High(FHandleArray) do
FindNextChangeNotification(FHandleArray[I]);
Delphi-Quellcode:
so würdest Du immer nur für das signalisierende ChangeNotification FindNext aufrufen... sollten 2 "gleichzeitig" signalisierend sein, ergäbe dies 2 Schleifendurchgänge hintereinander, da WaitForMultipleObjects immer nur für ein Object den Signaled-Status entfernt (dasjenige, das auch im Return-Value angegeben wurde)...
FindNextChangeNotification(FHandleArray[FWaitStatus - WAIT_OBJECT_0]);
|
Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
Zitat:
nehmen wir an ich habe 3 objekte. eines bekommt nun den signaled-status. dieser wird entfernt, ich rufe mein synchronize auf, um muss nur für dieses handle findnext* aufrufen. falls keines den signaled-status bekommt (WAIT_TIMEOUT) muss ich aber für alle 3 objekte findnext* aufrufen oder rufe ich einfach wieder waitfor* für alle 3 auf? logisch wäre mir nur findnext* aufzurufen wenn eines signaled ist. :gruebel: danke! [EDIT:] habe es gerade ausprobiert und natrülich darf FindNextChangeNotification NUR augerufen werden, wenn das Objekt vorher auch signaled war. Großer Fehler.. |
Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
:thumb: @Basilikum: DANKE !! :hello:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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