Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi WaitForMultipleObjects - Fehler durch zu frühes FindNext? (https://www.delphipraxis.net/30893-waitformultipleobjects-fehler-durch-zu-fruehes-findnext.html)

sieppl 30. Sep 2004 20:25


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:
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;
Hier der komplette Code:alter Beitrag

Danke!!

Grüße

Sebastian

NicoDE 30. Sep 2004 20:45

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
 
Zitat:

Zitat von sieppl
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?

Davon kannst Du ausgehen.
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 :))

Basilikum 30. Sep 2004 21:19

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
 
weshalb ersetzt Du nicht einfach die Zeile
Delphi-Quellcode:
for I := 0 to High(FHandleArray) do
      FindNextChangeNotification(FHandleArray[I]);
durch
Delphi-Quellcode:
FindNextChangeNotification(FHandleArray[FWaitStatus - WAIT_OBJECT_0]);
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)...

sieppl 30. Sep 2004 21:34

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
 
Zitat:

Zitat von Basilikum
weshalb ersetzt Du nicht einfach die Zeile
Delphi-Quellcode:
for I := 0 to High(FHandleArray) do
      FindNextChangeNotification(FHandleArray[I]);
durch
Delphi-Quellcode:
FindNextChangeNotification(FHandleArray[FWaitStatus - WAIT_OBJECT_0]);
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)...

das wollte ich wissen. ich fasse mal zusammen:
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..

sieppl 30. Sep 2004 21:53

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext
 
:thumb: @Basilikum: DANKE !! :hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz