AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread beenden

Ein Thema von Walter Landwehr · begonnen am 12. Mär 2017 · letzter Beitrag vom 12. Mär 2017
Antwort Antwort
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
380 Beiträge
 
Delphi 10.4 Sydney
 
#1

Thread beenden

  Alt 12. Mär 2017, 16:46
Hallo, Ich weiß es ist schon vieles über Thread beenden geschrieben worden aber das richtige habe ich noch nicht gefunden.

Also ich erzeuge einen Thread so.
Delphi-Quellcode:
public
  { Public-Deklarationen }
    calSyncThread: TNxSyncThread;

  procedure ThreadErzeugen(doResume: Boolean=true);
  procedure Threadbeenden;

implementation
 
procedure TdmMain.ThreadErzeugen(doResume: Boolean=true);
begin
  if CalSyncThread = nil then begin
    calSyncThread := TNxSyncThread.Create (True);
    calSyncThread.Server := ibconMain.Server;
    calSyncThread.Path := ibconMain.Path;
    calSyncThread.LogViewEnabled := False; // für Debug auf True stellen
    calSyncThread.Protocol := ibconMain.Protocol;
    calSyncThread.StartWork;
    calSyncThread.OnTerminate := TerminateCalSynThread;
    calSyncThread.FreeOnTerminate := False; // 11.03.2017 WL
  end;
  if doResume then
    calSyncThread.Resume;
end;
und will ihn so beenden:

Delphi-Quellcode:

procedure TdmMain.Threadbeenden;
begin if CalSyncThread = nil then Exit;
  if CalSyncThread.Worker <> nil then begin
    try
      CalSyncThread.Worker.stopped := true;
      CalSyncThread.Terminate;
      while CalSyncThread.running do begin ---------> An dieser Stelle kommt ab und zu eine Schutzverletzung aber nicht immer.
        Application.ProcessMessages;
        Sleep(0);
      end;
      CalSyncThread.Worker.StoreRefrehToken;
      CalSyncThread.Worker.NxHelper.con.Connected := false;
      // FreeAndNil(CalSyncThread);
    except;
    end;
  end;
  calSyncThread.suspend;
Wer weiß wie ich den Thread sauber beende.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.111 Beiträge
 
Delphi 12 Athens
 
#2

AW: Thread beenden

  Alt 12. Mär 2017, 17:11
Was ist "Runnig"?


Zum "Suspend":
Threads darf man niemals "extern" anhalten, nur der Tread kann das selber machen, da nur er sicherstellen kann, dass es nicht an einer "ungünstigen" Stelle passiert.
Es wäre z.B. echt blöd, wenn man einen Thread anhält, während er gerade Speicher beim Speichermanager anfordert/freigibt, und dabei das ganze Programm lahmlegt, weil dort eine CriticalSection gesperrt bleibt.

Und ein Thread der einmal beendet wurde (Terminated), kann nicht wieder fortgesetzt neu gestartet werden.
Also ist es eh sinnlos, dass dort FreeAndNil durch Suspend ersetzt wurde, da Resume nichts neu starten kann, was bereits beendet wurde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
380 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Thread beenden

  Alt 12. Mär 2017, 17:38
running ist ein Boolscher Wert True oder False.

Wird abgefragt ob der Thread noch läuft oder beendet ist.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.111 Beiträge
 
Delphi 12 Athens
 
#4

AW: Thread beenden

  Alt 12. Mär 2017, 18:03
Zitat:
while CalSyncThread.running do begin ---------> An dieser Stelle kommt ab und zu eine Schutzverletzung aber nicht immer.
War das vor oder nach?
[edit] vor der Änderung und nicht vor der Zeile

Zitat:
calSyncThread.FreeOnTerminate := False; // 11.03.2017 WL
Davor ist klar, wenn der Thread sich inzwischen schon freigegeben hat.

Bei FreeOnTerminate=True darf man nie wieder von außerhalb auf das Threadobjekt zugreifen, außer im OnTerminate oder im Thread.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (12. Mär 2017 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Thread beenden

  Alt 12. Mär 2017, 21:56
Ohne die Execute zu sehen, ist es schwierig dazu etwas zu sagen...

Mavarik
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:48 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