AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadsynchronisation

Ein Thema von StanY · begonnen am 13. Nov 2004 · letzter Beitrag vom 15. Nov 2004
Antwort Antwort
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#1

Threadsynchronisation

  Alt 13. Nov 2004, 15:16
Ich habe ein Problem mit der Synchronisation bei meinen Threads.

Ich habe ein Socket (TIdTCPClient) und dazu einen Thread, welcher ReadLn aufruft:

Delphi-Quellcode:
procedure TMyThread.Execute();
var
  Msg: String;
begin
  while Connection[SockId].Connected = true do begin
    Msg := Connection[SockId].ReadLn;
    WriteLn(Msg);
  end;
end;
Nun habe ich beim Beenden das Problem, dass ich bei dieser Zeile:
WriteLn(Msg); Einen Fehler bekomme, weil Connection[SockId] nicht 'connected' ist.

Lösen wollte ich das Problem so, dass ich beim Beenden folgendes Aufrufe:

Delphi-Quellcode:
  //erst die Threads beenden, damit keine Fehler auftreten
  for i := 0 to High(Connection) do begin
    Connection[i].Thread.Terminate;
  end;
und ein Stück code weiter:

Delphi-Quellcode:
  for i := 0 to High(Connection) do begin
    Connection[i].Disconnect;
    Connection[i].Free;
  end;
Allerdings bekomme ich denselben Fehler \:

Wer weiß Rat? (:
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#2

Re: Threadsynchronisation

  Alt 13. Nov 2004, 16:14
Hallo,

du solltest vielleicht das Terminieren so machen:

Delphi-Quellcode:
Connection[i].Thread.Terminate;
Connection[i].Thread.WaitFor;
das Terminate beendet die Threads ja nicht sofort, waitfor wartet bis sie wirklich weg sind.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#3

Re: Threadsynchronisation

  Alt 13. Nov 2004, 16:24
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 (;.
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#4

Re: Threadsynchronisation

  Alt 13. Nov 2004, 17:32
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.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#5

Re: Threadsynchronisation

  Alt 13. Nov 2004, 17:59
Will heißen? Ich würde es gerne sehr sauber lösen
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#6

Re: Threadsynchronisation

  Alt 13. Nov 2004, 18:30
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:
  //erst die Threads beenden, damit keine Fehler auftreten
  for i := 0 to High(Connection) do begin
    EnterCriticalSection(..);
    Connection[i].Disconnect;
    LeaveCriticalSection(..);
  end;
Also z.B. für den Thread (für jede Instanz!) eine TCriticalSection definieren.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#7

Re: Threadsynchronisation

  Alt 15. Nov 2004, 15:39
Kurz und knapp: Versteh' ich nicht (;

Was meinst du mit 'EnterCriticalSection'?

(sry)
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Threadsynchronisation

  Alt 15. Nov 2004, 18:11
wie wärs mit try except ?
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Threadsynchronisation

  Alt 15. Nov 2004, 18:14
Zitat von fiasko:
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;
Wenn du mit break aus der Schleife springst, wird nie LeaveCriticalSection aufgerufen und du hast ein DeadLock.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#10

Re: Threadsynchronisation

  Alt 15. Nov 2004, 20:12
Zitat von Luckie:
Wenn du mit break aus der Schleife springst, wird nie LeaveCriticalSection aufgerufen und du hast ein DeadLock.
Huch da gehört natürlich zumindest noch ein try finally drumm - aber ganz ohne Exception Handling wollte das wohl hoffentlich eh keiner übernehmen


Eine TCriticalSection ist eine Mutex Implementierung auf win32 Systemen.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 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