Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TThread Execute Methode dauerhaft laufen lassen (https://www.delphipraxis.net/113665-tthread-execute-methode-dauerhaft-laufen-lassen.html)

FAlter 12. Mai 2008 21:53

Re: TThread Execute Methode dauerhaft laufen lassen
 
Hi,

Die Lösung steht hier:

Zitat:

Zitat von sirius
ein "override" wäre in der Deklaration der Methode execute noch sehr hilfreich.

Mfg
FAlter

[edit] Mal wieder kein roter Kasten. :P Sonst habe wenigstens ich immer Glück. [/edit]

sk0r 12. Mai 2008 22:06

Re: TThread Execute Methode dauerhaft laufen lassen
 
Ok, danke für eure Hilfe. Hab ich wohl eine Sache der Grundkenntnisse vergessen. :/

Muetze1 12. Mai 2008 22:33

Re: TThread Execute Methode dauerhaft laufen lassen
 
... und deine Procedure "Free" kannst du auch gleich mal in die Tonne drücken und als
Delphi-Quellcode:
Destructor Destroy; override;
gleich mal neu auferstehen lassen...

Luckie 13. Mai 2008 08:12

Re: TThread Execute Methode dauerhaft laufen lassen
 
Hier: http://delphitutorials.michael-puff.de gibt es auch ein entsprechendes Tutorial.

sirius 13. Mai 2008 08:18

Re: TThread Execute Methode dauerhaft laufen lassen
 
Noch etwas:
Du greifst in deinem Thread auf eine globale Variable zu (gSmallSock.iSock). Du hast doch dein Sockethandle bereits innerhalb deines Threadobjektes. Das kannst du doch benutzen.
Die Procedure "recvProc" muss Threadsafe sein oder du musst vorher synchronisieren.

sk0r 17. Mai 2008 13:20

Re: TThread Execute Methode dauerhaft laufen lassen
 
Darf ich fragen, was Du mit Threadsafe genau meinst?^^

sirius 17. Mai 2008 17:23

Re: TThread Execute Methode dauerhaft laufen lassen
 
Du darfst in einer Funktion/Unit/Klasse/etc. , die du ThreadSafe haben möchtest, niemals auf Variablen oder Speicher zugreifen, die auch ausserhalb dieses Objektes genutzt werden (oder du musst synchronisieren).
Für dich bedeutet dass, dass du in RecvProc nur lokale Variablen verwenden darfst und vor allem keine GUI.

sk0r 17. Mai 2008 18:11

Re: TThread Execute Methode dauerhaft laufen lassen
 
Und wie kann ich es machen, damit ich auf globale Variablen/Speicher zugreifen darf, ohne Fehler zu verursachen?
Weil, irgendwie muss es ja gehen, die TClientSocket Komponente arbeitet doch auch mit Threads!?

sirius 17. Mai 2008 19:32

Re: TThread Execute Methode dauerhaft laufen lassen
 
Delphi-Quellcode:
type
  TSockThread = class(TThread)
    iSock: Cardinal;
    recvProc: procedure(szString: String);
    procedure Execute; override;
  protected
    FBuffer:string;
    procedure CallRecvProc;
  end;

  TSmallSock = class
      constructor Create(Address: PChar; Port: Cardinal);
      procedure Free;
    private
      lpAddress: PChar;
      dwPort: Cardinal;
      iSock: Cardinal;
      WSAData: TWSAData;
      addrIn: TSockAddrIn;
      dwThreadID: Cardinal;
      gThread: TSockThread;
    public
      procRecv: procedure(szString: String);
      function DoConnect:Boolean;
      function SendString(szString: String):Boolean;
  end;


var gSmallSock: TSmallSock;

implementation

procedure TSockThread.CallRecvProc;
begin
  recvProc(FBuffer);    
end;
procedure TSockThread.Execute;
var
  mBuf: array[0..1000-1] of Char;
begin
  if recv(iSock, mBuf, sizeof(mBuf), 0) <> SOCKET_ERROR then
  begin
    if mBuf <> '' then
    begin
      FBuffer:=mBuf;
      synchronize(CallRecvProc);
      mBuf := '';
    end;
  end;
end;

sk0r 29. Mai 2008 15:03

Re: TThread Execute Methode dauerhaft laufen lassen
 
Ok, eine Frage habe ich noch. :/

Wenn ich TClientSocket benutze und es kommen Daten rein, dann bleibt das Programm
"hängen", bis TClientSocket.OnRecieve ausgeführt wurde. Wie kann ich das realisieren?
Weil im Moment wird es ja "gleichzeitig" ausgeführt. Ich hoffe, ihr wisst, was ich meine. :/


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr.
Seite 2 von 3     12 3      

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