AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi WaitForMultipleObjects - Fehler durch zu frühes FindNext?

WaitForMultipleObjects - Fehler durch zu frühes FindNext?

Ein Thema von sieppl · begonnen am 30. Sep 2004 · letzter Beitrag vom 30. Sep 2004
Antwort Antwort
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#1

WaitForMultipleObjects - Fehler durch zu frühes FindNext?

  Alt 30. Sep 2004, 21:25
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
Sebastian
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext

  Alt 30. Sep 2004, 21:45
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 )
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#3

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext

  Alt 30. Sep 2004, 22:19
weshalb ersetzt Du nicht einfach die Zeile
Delphi-Quellcode:
for I := 0 to High(FHandleArray) do
      FindNextChangeNotification(FHandleArray[I]);
durch
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)...
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#4

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext

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

danke!

[EDIT:]

habe es gerade ausprobiert und natrülich darf FindNextChangeNotification NUR augerufen werden, wenn das Objekt vorher auch signaled war. Großer Fehler..
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#5

Re: WaitForMultipleObjects - Fehler durch zu frühes FindNext

  Alt 30. Sep 2004, 22:53
@Basilikum: DANKE !!
Sebastian
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 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