![]() |
warten bis Thread keine Jobs mehr hat.....
Servus,
habe da einen Thread. In einer Stringliste speicher ich die jobs ab. Wenn ich meine Anwendung beende, möchte ich noch warten bis alle Jobs verarbeitet wurden. also bis count = 0 ist. Nur irgend wie funzt dat nicht so kanz... (funzt nur mit application.processmessage) hier mal ein wenig code
Delphi-Quellcode:
Wenn ich es ohne application.ProcessMessages mache friert meine main auch ein.
TSqlThread = class(TThread)
private fSQLTimer : TTimer; Procedure OnSqlTimer(Sender : TObject); public Function IsEmpty : Boolean; protected Procedure Execute; override; end; function TSqlThread.IsEmpty: Boolean; begin result := fSqlList.Count-1 <= 0; end; procedure TSqlThread.OnSqlTimer(Sender: TObject); begin if fSqlList.Count-1 >= 0 then begin fcs.Enter; try fDB.SQLQuery(fSqlList[0]); fSqlList.Delete(0); finally fcs.Leave; end; if Assigned(fOnWriteSQL) then Synchronize(fOnWriteSQL); end; end; procedure TSqlThread.Execute; var MSG : TMsg; begin inherited; while ( GetMessage(msg, 0, 0, 0) ) do DispatchMessage(msg); end; // aus meiner main rufe ich bei einem thread diese methode auf. begin if fsql <> nil then while not fsql.IsEmpty do begin sleep(100); //muss ich machen weil sonst OnSqlTimer nicht aufgerufen wird.. application.ProcessMessages; //was aber nicht sein darf end; end; Bzw. der Timer vom SQLThread wird nicht aufgerufen...... Mache ich was falsch? |
Re: warten bis Thread keine Jobs mehr hat.....
Wieso eigentlich Count-1?
Delphi-Quellcode:
Sonst würde ja eine Liste, die noch ein Element enthält auch schon als leer interpretiert werden.
function TSqlThread.IsEmpty: Boolean;
begin result := fSqlList.Count = 0; end; |
Re: warten bis Thread keine Jobs mehr hat.....
Wo erstellst du denn den Timer?
|
Re: warten bis Thread keine Jobs mehr hat.....
Zitat:
Delphi-Quellcode:
constructor TSqlThread.Create(Host,User,Pass,Db : String);
begin inherited Create(false); fSQLTimer := TTimer.Create(nil); fSQLTimer.Interval := 100; fSQLTimer.OnTimer := OnSqlTimer; fSQLTimer.Enabled := true; end; |
Re: warten bis Thread keine Jobs mehr hat.....
Damit ist er im MainThread. Du must ihn in execute erstellen.
btw: Wenn Dein Thread außer dem Timer nichts beinhaltet bzw. den Rest synchronisiert, bringt dir der Timer nichts. du musst alles in den Thread nehmen oder du lässt es mit dem Thread. |
Re: warten bis Thread keine Jobs mehr hat.....
aso wuste nicht wenn ich ein object in der create eines Threads anlege das es dann im mainthread ist.....
thx |
Re: warten bis Thread keine Jobs mehr hat.....
habe 4 Threadklassen ..... da sehe ich gerade das ich alles in den threads bei create erstelle....
da muss ich das mal ummodeln..... |
Re: warten bis Thread keine Jobs mehr hat.....
Jep, der Constructor ist außerhalb des Threads, der Destructor innerhalb
|
Re: warten bis Thread keine Jobs mehr hat.....
hmmm das stellt mich jetzt aber vor einem problem.
In der Create des Threads habe ich meine objekte die ich brauche angelegt. (Timer, weiter Thread objekte, server socket etc) Anschließend wenn ich den Thread in der main erstellt habe, muss ich auf variabeln zugreifen die in der create erstellt wurden..... da jetzt aber alles in der execute erstellt wird, wie soll ich das dann lösen.....
Delphi-Quellcode:
einer eine idee
//alles wird in TThreadServer.Create erstellt
fServer := TThreadServer.Create('log.text'); fServer.OnProcCommand := OnGetDataFromAgent; //<- wie soll ich das dann machen fServer.OnClientConnect := OnClientConnect; fServer.OnClientDisconnect := OnClientDisconnect; fServer.GoOnline(12345); fServer.Resume; |
Re: warten bis Thread keine Jobs mehr hat.....
ok habe es jetzt mit einer methode gemacht. Diese wird vom Server aufgerufen wenn alles erstellt wurde.....
hmmm auf einmal läuft alles schneller und ohne fehler....... vielen dank!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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