![]() |
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:
P.S.: Auch wenn nur ein Core von der Anwendung benutzt wird, tritt das Problem auf.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 |
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:
Aber warum die erste Funktion auf dem Singlecore tadellos funktioniert ist mir schleierhaft.
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 |
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. [..]" |
Re: msgWaitforMultipleObjects verzögert auf Dual Core
Versuch mal:
Delphi-Quellcode:
dwWaitResult := WaitforMultipleObjects(length(ThreadArray), ThreadArray[0], true, 100);
|
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:
If fWaitAll is FALSE, the return value minus WAIT_OBJECT_0 indicates the pHandles array index of the object that satisfied the wait.
ThreadArray : array of THandle;
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:
Ich hätte halt gerne msgWaitforMultipleObjects um bei jeder Message die GUI zu Aktualisieren. das scheint aber Laut Basilikums Erklärung nicht zu funktionieren |
Re: msgWaitforMultipleObjects verzögert auf Dual Core
Zitat:
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:
bei Result WAIT_OBJECT_0 + Length(ThreadArray) weisst du, dass "nur" eine Nachricht zu bearbeiten ist.... |
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) |
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:
so viele Threads hab ich nähmlich
ThreadArray : array[0..3] of THandle;
|
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