![]() |
Sleep in einem Thread. Application.processmessage
hi,
normal wenn man dich der mainform ein sleep einbaut ruft man danach application.processmessage auf. Wie ist das beim Thread? |
Re: Sleep in einem Thread. Application.processmessage
Im Thread solltest du das nicht tun. Application.ProcessMessages bringt nichts, wenn es nicht aus dem Hauptthread aufgerufen wird.
|
Re: Sleep in einem Thread. Application.processmessage
ja aber in der main macht man es um die "nachrichten" zu aktualisieren was ist dann beim Thread?
|
Re: Sleep in einem Thread. Application.processmessage
Ich glaube, Du suchst Synchronize().
|
Re: Sleep in einem Thread. Application.processmessage
jetzt verstehe ich gar nichts mehr......
Habe einen Thread und im Thread baue ich die Verbindung mit den Sockets zum Server auf. Ohne Synchronize wird keine Verbindung aufgebaut mit Synchronize(GoOnline) schon.... Aber Synchronize ruft man doch nur auf wenn man was mit dem Hauptthread also der main abgleichen möchte... :gruebel: |
Re: Sleep in einem Thread. Application.processmessage
Die Sockets arbeiten mit Fensternachrichten. Du brauchst daher im erstellenden Thread eine Nachrichtenschleife.
|
Re: Sleep in einem Thread. Application.processmessage
aso.... deswegen hackt es hier und da..... und ich dachte das hängt am sleep....
Wie sieht so eine Nachrichtenschleife aus? |
Re: Sleep in einem Thread. Application.processmessage
Such mal nach Message loop, da dürftest Du fündig werden.
Alternativ gibts auch hier: ![]() |
Re: Sleep in einem Thread. Application.processmessage
danke....
|
Re: Sleep in einem Thread. Application.processmessage
Du könntest auch SoNIC benutzen, die kommen ganz ohne Nachrichten aus. Du musst nur innerhalb deines Threads regelmäßig oder wenn du Daten erwartest CheckData aufrufen.
(Jaja, Eigenwerbung :mrgreen:) ![]() ![]() |
Re: Sleep in einem Thread. Application.processmessage
Zitat:
Delphi-Quellcode:
msg ist vom Typ Tmsg und das translatemessage brauchst du nicht, da du in deinem Thread ja keine Tastatureingaben erwartest/bekommst.
while getmessage(msg,0,0,0) do dispatchmessage(msg)
Worauf du jetzt noch achten musst ist, dass du den Thread auch abbrechen kannst. |
Re: Sleep in einem Thread. Application.processmessage
muss ich umbedingt eine while draus machen....
habe es jetzt so gemacht
Delphi-Quellcode:
procedure TThreadClient.Execute;
var i : integer; msg : TMsg; begin inherited; repeat begin if fClient.Active then begin //... sende daten end; //Noch Online? if not fClient.Active then begin //... baue verbindung auf end; //Warte kurz sleep(1); GetMessage(msg, 0, 0, 0); TranslateMessage(msg); DispatchMessage(msg); end until Terminated; end; |
Re: Sleep in einem Thread. Application.processmessage
Wenn du immer wiederkehrende Aufgaben hast, solltest du diese in einen Timer auslagern. Es ist nämlich überhaupt nicht gesichert, dass GetMessage in annehmbarer Zeit zurückkehrt. Der Code sähe dann in etwa so aus:
Delphi-Quellcode:
procedure TThreadClient.OnTimer;
begin if fClient.Active then begin //... sende daten end; //Noch Online? if not fClient.Active then begin //... baue verbindung auf end; end; procedure TThreadClient.Execute; var Msg: TMsg; begin fTimer := TTimer.Create(nil); try fTimer.Interval := Wuppdi; fTimer.OnTimer := Self.OnTimer; fTimer.Enabled := True; while GetMessage(Msg, 0, 0, 0) do DispatchMessage(Msg); finally fTimer.Free; end; end; procedure TThreadClient.DoTerminate; begin PostThreadMessage(ThreadId, WM_QUIT, 0, 0); end; |
Re: Sleep in einem Thread. Application.processmessage
dann werde ich es so machen...
thx |
Re: Sleep in einem Thread. Application.processmessage
muss ich dann dennoch mit Synchronize(GoOnline) die online methode aufrufen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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