Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WaitForMultipleObjects und offene Arrays (https://www.delphipraxis.net/66736-waitformultipleobjects-und-offene-arrays.html)

elliott 3. Apr 2006 14:08


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?

Basilikum 3. Apr 2006 14:24

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)...

elliott 3. Apr 2006 14:56

Beispiel
 
zum Beispiel so:

Delphi-Quellcode:
var
  ThreadHandleListe: array of tHandle;
  WaitErgebnis: cardinal;
...
  WaitErgebnis:= WaitForMultipleObjects( length(ThreadHandleListe), @ThreadHandleListe, true, 0 );
Das WaitErgebnis ist irgendwie immer $FFFFFFFF, ob die Threads nun noch laufen oder nicht.

Die Muhkuh 3. Apr 2006 14:57

Re: WaitForMultipleObjects und offene Arrays
 
Hi,

bin mir nicht ganz sicher, aber versuche mal High statt Length.

elliott 3. Apr 2006 16:11

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:
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;
So läuft {Beispiel 2} und das Ergebnis ergibt 0.
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...

Basilikum 3. Apr 2006 16:58

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);

elliott 3. Apr 2006 17:07

Re: WaitForMultipleObjects und offene Arrays
 
Danke!
Jetzt funktioniert es! :thumb: :)

Luckie 3. Apr 2006 18:13

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.

Basilikum 3. Apr 2006 18:16

Re: WaitForMultipleObjects und offene Arrays
 
Zitat:

Zitat von Luckie
Und es sollte length()-1 heißen. Das Eloement length() gibt es nämlich nicht, da dynamische Array null-basierend sind.

nein, das ist absolut korrekt so !
das API erwartet die ANZAHL der Handles, nicht den höchsten Index....

Luckie 3. Apr 2006 18:30

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