Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Sleep in einem Thread. Application.processmessage (https://www.delphipraxis.net/122506-sleep-einem-thread-application-processmessage.html)

Thomas83 17. Okt 2008 09:39


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?

Apollonius 17. Okt 2008 09:43

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.

Thomas83 17. Okt 2008 09:48

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?

DeddyH 17. Okt 2008 09:50

Re: Sleep in einem Thread. Application.processmessage
 
Ich glaube, Du suchst Synchronize().

Thomas83 17. Okt 2008 10:14

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:

Apollonius 17. Okt 2008 10:24

Re: Sleep in einem Thread. Application.processmessage
 
Die Sockets arbeiten mit Fensternachrichten. Du brauchst daher im erstellenden Thread eine Nachrichtenschleife.

Thomas83 17. Okt 2008 10:25

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?

Phoenix 17. Okt 2008 11:14

Re: Sleep in einem Thread. Application.processmessage
 
Such mal nach Message loop, da dürftest Du fündig werden.
Alternativ gibts auch hier: http://delphi.about.com/od/windowssh.../aa111503d.htm einen recht kurzen Abriss darüber, wie man eine Nachrichtenschleife aufbaut.

Thomas83 17. Okt 2008 11:15

Re: Sleep in einem Thread. Application.processmessage
 
danke....

inherited 17. Okt 2008 11:33

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:)
http://www.delphipraxis.net/internal...t.php?t=141942
http://user.informatik.uni-goettinge...ka/?page_id=24

sirius 17. Okt 2008 11:43

Re: Sleep in einem Thread. Application.processmessage
 
Zitat:

Zitat von Thomas83
aso.... deswegen hackt es hier und da..... und ich dachte das hängt am sleep....
Wie sieht so eine Nachrichtenschleife aus?

Kurzum, die Nachrichtenschleife ist einfach nur das hier:
Delphi-Quellcode:
while getmessage(msg,0,0,0) do dispatchmessage(msg)
msg ist vom Typ Tmsg und das translatemessage brauchst du nicht, da du in deinem Thread ja keine Tastatureingaben erwartest/bekommst.

Worauf du jetzt noch achten musst ist, dass du den Thread auch abbrechen kannst.

Thomas83 17. Okt 2008 11:50

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;

Apollonius 17. Okt 2008 11:56

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;

Thomas83 17. Okt 2008 11:59

Re: Sleep in einem Thread. Application.processmessage
 
dann werde ich es so machen...

thx

Thomas83 17. Okt 2008 12:40

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 06:43 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