![]() |
WaitForMultipleObjects und offene Arrays
Hallo!
Ich habe folgendes Problem: Wenn ich WaitForMultipleObjects mit einem offenen Array fütter, dann endet das immer mit einem Fehler. Weiss jemand zufällig ob man dort nur normale Arrays benutzen kann? |
Re: WaitForMultipleObjects und offene Arrays
zeig mal dein jetztiger Aufruf (Code)... ich habe einen Verdacht, wäre aber ohne weitere Informationen ein Raten...
grundsätzlich kann man beide Array-Arten für WaitForMultipleObjects verwenden (mit dem richtigen Aufruf)... |
Beispiel
zum Beispiel so:
Delphi-Quellcode:
Das WaitErgebnis ist irgendwie immer $FFFFFFFF, ob die Threads nun noch laufen oder nicht.
var
ThreadHandleListe: array of tHandle; WaitErgebnis: cardinal; ... WaitErgebnis:= WaitForMultipleObjects( length(ThreadHandleListe), @ThreadHandleListe, true, 0 ); |
Re: WaitForMultipleObjects und offene Arrays
Hi,
bin mir nicht ganz sicher, aber versuche mal High statt Length. |
komplettes Beispiel
Hier ein komplettes Beispiel.
Je nachdem ob mit einem offenen oder normalen Array probiert werden soll muss man nur die Klammern vor dem Beispiel setzen...
Delphi-Quellcode:
So läuft {Beispiel 2} und das Ergebnis ergibt 0.
procedure testWFMO;
var { ThreadHandleListe: array of tHandle; {Beispiel 1} ThreadHandleListe: array[0..4] of tHandle; {Beispiel 2} WaitErgebnis: cardinal; cZaehler: cardinal; begin { SetLength( ThreadHandleListe, 5 ); {Beispiel 1} for cZaehler:= 1 to length(ThreadHandleListe) do ThreadHandleListe[cZaehler -1]:= CreateEvent( nil,true, true, nil ); WaitErgebnis:= WaitForMultipleObjects( length(ThreadHandleListe), @ThreadHandleListe, true, 0 ); writeln( WaitErgebnis ); for cZaehler:= 1 to length(ThreadHandleListe) do CloseHandle( ThreadHandleListe[cZaehler -1] ); { SetLength( ThreadHandleListe, 0 ); {Beispiel 1} end; Wenn man vor {Beispiel 2} vorn noch eine Klmmer setzt und die anderen vorn entfernt, hat men {Beispiel 1}, welches $FFFFFFFF ergibt... Dabei ist es nicht relevant ob man high oder length benutzt... |
Re: WaitForMultipleObjects und offene Arrays
bei dynamischen Arrays braucht es noch das [0], ansonsten übergibtst du der API einen Pointer auf einen Pointer auf die Handles (einmal Pointer zuviel).... (Verdacht bestätigt :-) )
Code:
WaitErgebnis:= WaitForMultipleObjects( length(ThreadHandleListe),@ThreadHandleListe[color=#ff003f][0][/color],true,0);
|
Re: WaitForMultipleObjects und offene Arrays
Danke!
Jetzt funktioniert es! :thumb: :) |
Re: WaitForMultipleObjects und offene Arrays
Und es sollte length()-1 heißen. Das Eloement length() gibt es nämlich nicht, da dynamische Array null-basierend sind.
|
Re: WaitForMultipleObjects und offene Arrays
Zitat:
das API erwartet die ANZAHL der Handles, nicht den höchsten Index.... |
Re: WaitForMultipleObjects und offene Arrays
Ups. Mein Fehler. :oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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