![]() |
Re: TThread Execute Methode dauerhaft laufen lassen
Hi,
Die Lösung steht hier: Zitat:
FAlter [edit] Mal wieder kein roter Kasten. :P Sonst habe wenigstens ich immer Glück. [/edit] |
Re: TThread Execute Methode dauerhaft laufen lassen
Ok, danke für eure Hilfe. Hab ich wohl eine Sache der Grundkenntnisse vergessen. :/
|
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:
gleich mal neu auferstehen lassen...
Destructor Destroy; override;
|
Re: TThread Execute Methode dauerhaft laufen lassen
Hier:
![]() |
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. |
Re: TThread Execute Methode dauerhaft laufen lassen
Darf ich fragen, was Du mit Threadsafe genau meinst?^^
|
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. |
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!? |
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; |
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. |
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