![]() |
AW: TThread - Sleep
Delphi-Quellcode:
Ungetestet :-)
TMyThreadContainer = class
private FCSResults: TCriticalSection; FResults: TStringList; FInfoHandle: HWnd; FInfoMessage: Cardinal; //... public procedure Start(AInfoFormHandle: Handle; AMessage: Cardinal); procedure AddResult(AString: string); function HasMoreResults: Boolean; function GetResult: string; //... end; //... procedure TMyThreadContainer.Start(AInfoFormHandle: HWnd; AMessage: Cardinal); begin // ... FInfoHandle := AInfoFormHandle; FInfoMessage := AMessage; // ... end; procedure TMyThreadContainer.AddResult(AString: string); begin FCSResults.Enter; try FResults.Add(AString); // immer oben drauf finally FResults.Leave; end; // Sperrung der Section so kurz wie möglich halten PostMessage(FInfoHandle, FInfoMessage, 0, 0); end; procedure TMyThreadContainer.HasMoreResults: Boolean; begin FCSResults.Enter; try result := FResults.Count > 0; finally FResults.Leave; end; end; procedure TMyThreadContainer.GetResult: string; begin FCSResults.Enter; try result := FResults[0]; // UPS -> hier noch löschen :-) FResults.Delete(0); finally FResults.Leave; end; end; //.... const WM_NEW_RESULTS = WM_USER +1; type TForm1 = class(TForm) procedure WMNewResults(msg: TMessage);message WM_NEW_RESULTS; //... end; procedure TForm1.DoStart; begin // .... MyThreadContainer.Start(Self.Handle, WM_NEW_RESULTS); // .... end; procedure TForm1.WMNewResults(msg: TMesssage); begin Listbox1.Items.BeginUpdate; try while MyThreadContainer.HasMoreResults do begin ListBox1.Items.Add(MyThreadContainer.GetResult); end; finally ListBox1.Items.EndUpdate; end; end; Greez, Chris |
AW: TThread - Sleep
Moin,
Zitat:
Ich selber mache da auch gerne ein synchronisiertes Event draus. Zitat:
MfG Fabian |
AW: TThread - Sleep
*PUSH*
Hat jemand schon eine Lösung warum "Sleep" und "Synchronize" nicht gut zusammen spielen ? bYe |
AW: TThread - Sleep
Hallo JoltinJoe,
du hast ja schon aufgezeigt bekommen, wie du Dein Problem lösen kannst. Bisher habe ich keine Probleme mit Synchronize und Sleep gehabt, wenn ich sie richtig "miteinander" verwendet habe. Du könntest ja einfach mal ein Demoprojekt zusammenbauen, bei dem Du zeigst, dass dieses Problem in Deiner Verwendung auftritt. Dann könnte man es genauer heraus bekommen. Greez, Chris |
AW: TThread - Sleep
Hallo zusammen ;)
Tut mir Leid, dass ich diesen alten Thread nochmal ausgrabe, aber ich abe ein ähnliches Problem mit Theads und sleep. Ich habe versucht den Beispielcode der hier geschrieben wurde umzusetzen, jedoch ohne Erfolg. Ich möchte lediglich einen neuen Thread aufmachen, dort 5 sek warten und danach einige prozeduren ausführen. Könnte mir jemand erklären wie das geht? Ich werde aus diesem ganzen CriticalSection,highcontainer etc. nich wirklich schlau :lol: Hat evtl. jemand eine fertige klasse für mich? Was genau muss ich bei MyThread.execute ändern? Wäre super, wenn jemand mir weiterhelfen könnte MfG w4rheart |
AW: TThread - Sleep
Hallo w4rheart,
Zitat:
Delphi-Quellcode:
Ich denke aber das das nicht dein Problem lösen wird. Bei Threads bedarf es u.U. etwas mehr an wissen rund um das Problem. Wichtig ist z.B. auch, dass die in der Execute-Methode eines Threads nicht auf die VCL (Formulare / Visuelle Komponenten) zugreifst. D.h. eben auch nicht auf Methoden zugreifst, die das dann machen ;-)
procedure TMyThread2.Execute;
begin // 5 Sekunden Warten Sleep(5000); // Ein paar Prozeduren ausführen Self.Mehtode1; Self.Methode2; end; Gruß, Chris |
AW: TThread - Sleep
Hallo ChisE, danke für deine Antwort.
ALso auf Visel Komponenten und der gleichen greife ich nicht zu. Das ganze ist ein Netzwerkspiel, die Prozedur befindet sich auf dem Server. Deser soll halt, wenn wein ein Spieler gestorben ist diesen nach 5 sekunden wiederbeleben. -> Daher halt die Idee mit Threads, weil der halt 5 sek warten soll, und mit sleep sich das ganze programm aufhängt... Hättest du da evtl. eine praktikable Lösung? MfG |
AW: TThread - Sleep
Timer? - Also ich denke mal nicht, dass diese 5 Sekunden exakt genaustens eingehalten werden müssen. +- 10 Millisekunden (durch den Timer) dürften immer noch akzeptabel sein.
Bernhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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