![]() |
Threadproblem auf einem "langsameren" Rechner
Hallo zusammen,
ich habe folgendes Problem, ich rufeso meine zwei Thread aus dem Haupttread auf :
Delphi-Quellcode:
Die beiden Threads machen nichts anderes als Verzeichnisse zu vergleichen und mir die aktuellen Dateien, die gerade verglichen werden in einem Fenster anzuzeigen. Nach dem finally, wird das Fenster geschlossen und dann die Ergebnisliste angezeigt. Wenn ich diesen Aufruf auf meinem AMD Athlon 64 3200+ aufrufe, funktioniert alles wunderbar. Wenn ich jetzt das gleiche Programm auf meinem IBM Thinkpad 1GHz aufrufe, muss ich immer erst die Maus über das Fenster bewegen, dass das Programm die Ergebnisliste anzeigt.
try
SearchForDelete := TSearchDelete.Create(false); SearchForDelete.FreeOnTerminate := False; SearchForCopy := TSearchCopy.Create(false); SearchForCopy.FreeOnTerminate := False; ThreadArray[0] := SearchForCopy.Handle; // Handle Array füllen ThreadArray[1] := SearchForDelete.Handle; repeat // Auf Threads warten dwWaitResult := msgWaitforMultipleObjects(length(ThreadArray), ThreadArray, true, 10, QS_ALLINPUT); if dwWaitResult <> WAIT_OBJECT_0 then begin Application.ProcessMessages; // GUI aktualisieren PeekMessage(msg, Application.Handle, 0, 0, PM_REMOVE); PeekMessage(msg, SearchForCopy.Handle, 0, 0, PM_REMOVE); PeekMessage(msg, SearchForDelete.Handle, 0, 0, PM_REMOVE); end; if CancelSync then begin TerminateThread(ThreadArray[0], 0); TerminateThread(ThreadArray[1], 0); dwWaitResult := WAIT_OBJECT_0; end; until dwWaitResult = WAIT_OBJECT_0; // keinen Threads mehr zum warten finally SearchForCopy.Free; SearchForDelete.Free; end; Weiß jemand rat, warum das so ist ? |
Re: Threadproblem auf einem "langsameren" Rechner
Hi,
wie läuft denn die Anzeige der Dateien ab? Hast Du denn dort berücksichtigt, dass diese Anzeige synchronisiert werden muss? Gruß Der Unwissende |
Re: Threadproblem auf einem "langsameren" Rechner
Zitat:
Zitat:
Edit: Auf dem Athlon 64 3200+ läuft ja alles bestens. Alles ohne Probleme. Edit 2: Auch jetzt läuft es nichtmehr auf dem Athlon 64 3200+. Ich werde noch wahnsinnig mit Threads :spin2: :firejump: :wall: Lasse ich alles über meine Statusbar laufen im Hauptfenster, dann funktioniert alles wunderbar auf beiden Rechnern. |
Re: Threadproblem auf einem "langsameren" Rechner
Hi,
Nicht verzweifeln! Das Problem hatte auch schon nur mit DualCore Rechnern. Ich habs jetzt so laufen, funktioniert Tip Top
Delphi-Quellcode:
Mir wurde gesagt, das Windows erst wenn alle Threads beendet sind und eine Message ansteht WAIT_OBJECT_0 zurückgibt. komischerweise gings bei mir anfänglich auch problemlos.
var
ThreadArray : array[0..1] of THandle; dwWaitResult := WaitforMultipleObjects(length(ThreadArray), @ThreadArray, true, 100); Edit: Hatte damals einen Thread aufgemacht ![]() Edit2: Deklaration von ThreadArray geändert um Missverständnisse zu vermeiden |
Re: Threadproblem auf einem "langsameren" Rechner
Hi,
Zitat:
Es gibt 2 Threads, also sollte wohl die Länge des ThreadArray und damit der Count für msgWaitForMultipleObjects auf 2 sein. Oder hab ich was übersehen? :gruebel: Ich denke das Problem ist msgWait... weil es müssen die zwei Threads zuende gelaufen sein UND ein Ereignis in der MessageQueue sein (QS_ALL_INPUT). Das heist, das passiert wohl mit der Maus. Das es auf dem einen Rechner mal läuft ist wohl eher ein Zufall (vielleicht gegen die Maus gestubst ?). Der Ansatz mit WaitForMultipleObjects wäre wohl besser, mit einem kurzen Timeout (10 msec war schon nicht schlecht) und dann einfach ein Applicaction.ProcessMessages. Die beiden PeekMessage verstehe ich nicht, wozu sollen die dienen? Die nehmen doch wieder nur Messages aus der Queue, die dir dann fehlen. Oder hab ich auch hier was übersehen ? :gruebel: Gruss |
Re: Threadproblem auf einem "langsameren" Rechner
Die Deklaration von ThreadArray stammt aus meinem Projekt in dem 4 Threads zum Warten vorhanden sind.
Ich wollte damit eigentlich nur die Deklaration verdeutlichen. Das Peakmessage versteh ich auch nicht da sollte am besten nur Application.Processmessages hin sonst reagiert die Form ja trotz Threads nicht mehr. |
Re: Threadproblem auf einem "langsameren" Rechner
Hallo zusammen,
erstmal ein dickes Danke an Euch. Ich habe den Teil des Codes jetzt so geändert :
Delphi-Quellcode:
Dieses funktioniert seeeehr gut. Ich habe nur noch ein kleines Problem mit den Labels, die während der Ausführung von den beiden Threads auf dem langsamen Rechner nicht funktioniert. Auf schnelleren Rechnern habe ich das Problem nicht. Ich habe mich mal durch ein paar Tutorials gelesen. Da habe ich den Begriff 'Synchronisieren' aufgegriffen. Wie funktioniert das mit dem Synchronisieren und muss ich das in diesem Teil des Codes einsetzen oder als extra Procedure in der Klasse TThread ?
try
SearchForDelete := TSearchDelete.Create(False); SearchForDelete.FreeOnTerminate := False; SearchForCopy := TSearchCopy.Create(False); SearchForCopy.FreeOnTerminate := False; ThreadArray[0] := SearchForCopy.Handle; // Handle Array füllen ThreadArray[1] := SearchForDelete.Handle; repeat // Auf Threads warten dwWaitResult := WaitforMultipleObjects(length(ThreadArray), @ThreadArray, true, 10); if dwWaitResult <> WAIT_OBJECT_0 then begin Application.ProcessMessages; // GUI aktualisieren end; if CancelSync then begin TerminateThread(ThreadArray[0], 0); TerminateThread(ThreadArray[1], 0); dwWaitResult := WAIT_OBJECT_0; end; until dwWaitResult = WAIT_OBJECT_0; // keinen Threads mehr zum warten finally SearchForCopy.Free; SearchForDelete.Free; end; |
Re: Threadproblem auf einem "langsameren" Rechner
Hi,
Das mit dem Syncronisieren geht so, Alles was mit dem Hauprogramm zu tun hat wird mit der Funktion Syncronize auferufen
Delphi-Quellcode:
Leider kann man der Prozedur/Funktion die Innehalb von Syncronize steht keine Parameter übergeben.
{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
nur in einer Methode namens Synchronize aufgerufen werden, z.B.} Synchronize(UpdateCaption); //und UpdateCaption könnte folgendermaßen aussehen: procedure Thread.UpdateCaption; begin Form1.Caption := 'Aktualisiert in einem Thread'; end; Falls du also eine Variable Caption übergeben willst muss eine Variable Thread global definiert sein |
Re: Threadproblem auf einem "langsameren" Rechner
Danke an euch alle, jetzt funktioniert meine synchronisation mit den Threads und das die Ergebnisliste gleich angezeigt wird.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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 by Thomas Breitkreuz