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 msgWaitforMultipleObjects verzögert auf Dual Core (https://www.delphipraxis.net/81843-msgwaitformultipleobjects-verzoegert-auf-dual-core.html)

C.Schoch 4. Dez 2006 19:34


msgWaitforMultipleObjects verzögert auf Dual Core
 
Hi,
msgWaitforMultipleObjects benötigt bis zu 20 Sekunden nach Beendigung des letzten Thread um WAIT_OBJECT_0 zurückzugeben sonst wird immer nur WAIT_TIMEOUT zurückgegeben.
Das passiert aber nur mit DualCores auf den Single Cores sieht alles normal aus.
Die Hauptanwendung läuft auf beiden Cores und die Threads werden auf verschiedene Cores verteilt.

Delphi-Quellcode:
         
repeat
  // Auf Threads warten
  dwWaitResult := msgWaitforMultipleObjects(length(ThreadArray), ThreadArray, true, 100, QS_ALLINPUT);
  if dwWaitResult <> WAIT_OBJECT_0 then
  begin
    StatusbarUpdate; // Statusbar updaten / Progress berechnen
    pmShowErrors.Enabled := bError and (tvSourceDestination.FocusedNode <> nil);
    mmShowErrors.Enabled := pmShowErrors.Enabled;
    Application.ProcessMessages; // GUI aktualisieren
  end;
until dwWaitResult = WAIT_OBJECT_0; // keinen Threads mehr zum warten
P.S.: Auch wenn nur ein Core von der Anwendung benutzt wird, tritt das Problem auf.

C.Schoch 9. Dez 2006 11:59

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
Es scheint so als ob das Programm est nach erhalt einer Message WAIT_OBJECT_0 zurückgiebt.
Deshalb hab ich das jetzt mit WaitforMultipleObjects gelöst und zwar so.
Delphi-Quellcode:
repeat
  // Auf Threads warten
  dwWaitResult := WaitforMultipleObjects(length(ThreadArray), @ThreadArray, true, 100);
  if dwWaitResult <> WAIT_OBJECT_0 then
  begin
    StatusbarUpdate; // Statusbar updaten / Progress berechnen
    pmShowErrors.Enabled := bError and (tvSourceDestination.FocusedNode <> nil);
    mmShowErrors.Enabled := pmShowErrors.Enabled;
    Application.ProcessMessages; // GUI aktualisieren
  end;
until dwWaitResult = WAIT_OBJECT_0; // keinen Threads mehr zum warten
Aber warum die erste Funktion auf dem Singlecore tadellos funktioniert ist mir schleierhaft.

Basilikum 9. Dez 2006 13:58

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
wie ist denn dein 'ThreadArray' deklariert ?

btw: du setzt fWaitAll auf true - ist das wirklich gewünscht ? so müssen alle Threads beendet sein UND eine Message in der Queue liegen...
"[..] When fWaitAll is TRUE, the function's wait is completed only when the states of all objects have been set to signaled, including the input events specified by dwWaskMask. [..]"

Luckie 9. Dez 2006 14:02

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
Versuch mal:
Delphi-Quellcode:
dwWaitResult := WaitforMultipleObjects(length(ThreadArray), ThreadArray[0], true, 100);

C.Schoch 9. Dez 2006 17:47

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
@Basilikum: fWaitAll ist gewollt, da ich ja auf alle Threads warten möchte in ThreadArray warten möchte. falls immer WAIT_OBJECT_0 beim letzten also 4. Thread zurückgegeben wird ist dieser Flag natürlich hinfällig.
ThreadArray ist so Deklariert:
Delphi-Quellcode:
ThreadArray : array of THandle;
If fWaitAll is FALSE, the return value minus WAIT_OBJECT_0 indicates the pHandles array index of the object that satisfied the wait.

Das heist IMO, dass ich immer den Index des Threads, der gerade Zurückgekehrt ist im Handle Array erhalte und das Nützt mir nichts.

Zitat:

Zitat von Luckie
Versuch mal:
Delphi-Quellcode:
dwWaitResult := WaitforMultipleObjects(length(ThreadArray), ThreadArray[0], true, 100);

Warum soll ich nur ein Handle übergeben?

Ich hätte halt gerne msgWaitforMultipleObjects um bei jeder Message die GUI zu Aktualisieren. das scheint aber Laut Basilikums Erklärung nicht zu funktionieren

Basilikum 9. Dez 2006 18:44

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
Zitat:

Zitat von C.Schoch
@Basilikum: fWaitAll ist gewollt, da ich ja auf alle Threads warten möchte in ThreadArray warten möchte. falls immer WAIT_OBJECT_0 beim letzten also 4. Thread zurückgegeben wird ist dieser Flag natürlich hinfällig.
ThreadArray ist so Deklariert:
Delphi-Quellcode:
ThreadArray : array of THandle;

diese Frage hat sich erübrigt - ich habe soeben mit Schrecken festgestellt, dass der Compiler für
WaitforMultipleObjects(...,@ThreadArray,...)
und
WaitforMultipleObjects(...,@ThreadArray[0],...)
den exakt selben Assembler-Code erzeugt (die 1. Variante müsste ja eigentlich einen Pointer auf einen Pointer (dyn. Array ist eigentlich ein Pointer) auf die Handles übergeben - macht sie aber nicht)

Zitat:

Zitat von C.Schoch
If fWaitAll is FALSE, the return value minus WAIT_OBJECT_0 indicates the pHandles array index of the object that satisfied the wait.

Das heist IMO, dass ich immer den Index des Threads, der gerade Zurückgekehrt ist im Handle Array erhalte und das Nützt mir nichts.

Ich hätte halt gerne msgWaitforMultipleObjects um bei jeder Message die GUI zu Aktualisieren. das scheint aber Laut Basilikums Erklärung nicht zu funktionieren

ich fürchte, du wirst nicht vermeiden können, fWaitAll auf false zu setzen und nach jeder Terminierung eines Thread dessen Handle aus dem Thread-Array zu streichen, bis Length(ThreadArray) = 0
bei Result WAIT_OBJECT_0 + Length(ThreadArray) weisst du, dass "nur" eine Nachricht zu bearbeiten ist....

Christian Seehase 9. Dez 2006 22:16

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
Moin Christian,

warum nimmst Du eigentlich ein dynamisches Array?
Es sind maximal MAXIMUM_WAIT_OBJECTS möglich, also ginge auch ein statisches Array (der Typ des zweiten Parameters ist auch so, als Pointer auf ein statisches Array, deklariert)

C.Schoch 11. Dez 2006 00:31

Re: msgWaitforMultipleObjects verzögert auf Dual Core
 
Hi,
Das Array ist nicht dynamisch mir ist ein Tippfehler unterlaufen. :oops:
Es muss naürlich heisen
Delphi-Quellcode:
ThreadArray : array[0..3] of THandle;
so viele Threads hab ich nähmlich


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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