AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi msgWaitforMultipleObjects verzögert auf Dual Core
Thema durchsuchen
Ansicht
Themen-Optionen

msgWaitforMultipleObjects verzögert auf Dual Core

Ein Thema von C.Schoch · begonnen am 4. Dez 2006 · letzter Beitrag vom 11. Dez 2006
Antwort Antwort
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#1

msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 4. Dez 2006, 19:34
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.
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 9. Dez 2006, 11:59
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.
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Basilikum

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

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 9. Dez 2006, 13:58
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. [..]"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 9. Dez 2006, 14:02
Versuch mal:
dwWaitResult := WaitforMultipleObjects(length(ThreadArray), ThreadArray[0], true, 100);
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 9. Dez 2006, 17:47
@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:
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 von Luckie:
Versuch mal:
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
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Basilikum

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

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 9. Dez 2006, 18:44
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:
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 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....
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 9. Dez 2006, 22:16
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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: msgWaitforMultipleObjects verzögert auf Dual Core

  Alt 11. Dez 2006, 00:31
Hi,
Das Array ist nicht dynamisch mir ist ein Tippfehler unterlaufen.
Es muss naürlich heisen
ThreadArray : array[0..3] of THandle; so viele Threads hab ich nähmlich
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:21 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