![]() |
Threadsynchronisation
Ich habe ein Problem mit der Synchronisation bei meinen Threads.
Ich habe ein Socket (TIdTCPClient) und dazu einen Thread, welcher ReadLn aufruft:
Delphi-Quellcode:
Nun habe ich beim Beenden das Problem, dass ich bei dieser Zeile:
procedure TMyThread.Execute();
var Msg: String; begin while Connection[SockId].Connected = true do begin Msg := Connection[SockId].ReadLn; WriteLn(Msg); end; end;
Delphi-Quellcode:
Einen Fehler bekomme, weil Connection[SockId] nicht 'connected' ist.
WriteLn(Msg);
Lösen wollte ich das Problem so, dass ich beim Beenden folgendes Aufrufe:
Delphi-Quellcode:
und ein Stück code weiter:
//erst die Threads beenden, damit keine Fehler auftreten
for i := 0 to High(Connection) do begin Connection[i].Thread.Terminate; end;
Delphi-Quellcode:
Allerdings bekomme ich denselben Fehler \:
for i := 0 to High(Connection) do begin
Connection[i].Disconnect; Connection[i].Free; end; Wer weiß Rat? (: |
Re: Threadsynchronisation
Hallo,
du solltest vielleicht das Terminieren so machen:
Delphi-Quellcode:
das Terminate beendet die Threads ja nicht sofort, waitfor wartet bis sie wirklich weg sind.
Connection[i].Thread.Terminate;
Connection[i].Thread.WaitFor; |
Re: Threadsynchronisation
Das Problem daran ist, oder scheint folgendes zu sein:
Dadurch, dass der Thread erst beendet wird, wenn er zu Ende 'gelaufen' ist. Wartet er sich bei ReadLn; tot, da keine Nachrichten vom Server kommen (;. |
Re: Threadsynchronisation
Jo, jetzt verstehe ich dein Problem auch langsam ;-). Dann mach also nach dem .Terminate das Disconnect und lass das WaitFor drinne. Vor dem WriteLn machst du noch eine Überprüfung rein ob immernoch Connected ist und dann müßte das gehen. Das ist aber nicht ganz sauber, da zwischen dieser überprüfung und dem WriteLn gerade das disconnect kommen könnte - eigentlich müßtest du das mit gegenseitigen Ausschluß schützen.
|
Re: Threadsynchronisation
Will heißen? Ich würde es gerne sehr sauber lösen :D
|
Re: Threadsynchronisation
Ich stelle mir das so vor:
Delphi-Quellcode:
procedure TMyThread.Execute();
var Msg: String; c: boolean; begin while not Terminated do begin EnterCriticalSection(..); if not Connection[SockId].Connected then break; Msg := Connection[SockId].ReadLn; WriteLn(Msg); LeaveCriticalSection(..); end; end;
Delphi-Quellcode:
Also z.B. für den Thread (für jede Instanz!) eine TCriticalSection definieren.
//erst die Threads beenden, damit keine Fehler auftreten
for i := 0 to High(Connection) do begin EnterCriticalSection(..); Connection[i].Disconnect; LeaveCriticalSection(..); end; |
Re: Threadsynchronisation
Kurz und knapp: Versteh' ich nicht (;
Was meinst du mit 'EnterCriticalSection'? (sry) |
Re: Threadsynchronisation
wie wärs mit try except ?
|
Re: Threadsynchronisation
Zitat:
|
Re: Threadsynchronisation
Zitat:
Eine TCriticalSection ist eine Mutex Implementierung auf win32 Systemen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz