AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread abschießen bei Programmende?

Ein Thema von HJay · begonnen am 21. Dez 2012 · letzter Beitrag vom 27. Dez 2012
Antwort Antwort
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

Thread abschießen bei Programmende?

  Alt 21. Dez 2012, 17:04
Ich starte einige Threads, um über Indy idHTTP parallel Daten zu laden.

Wenn der Nutzer nun das Programm abbricht, bevor diese Threads fertig sind, dann würde ich diese Threads gerne korrekt beenden. Kann man das machen?

Die Threads haben keine Loop oder so sondern führen als einzigen längeren Befehl ein TidHTTP.Post oder .Get aus, das eben solange dauert.

Gibt es dazu eine geradlinige Lösung?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Thread abschießen bei Programmende?

  Alt 21. Dez 2012, 18:21
Um dem Thread zu signalisieren, dass er aufhören soll rufst du die Methode Terminate auf.
Innerhalb des Threads kann man sich in dem Event OnWork einklinken:
Delphi-Quellcode:
type
  TDownloadThread = class(TThread)
  private
    FIdHTTP: TIdHTTP;
    procedure OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Integer);
  public
    constructor Create(CreateSuspended: Boolean);
    property Cancel: boolean read FCancel write FCancel;
  end;

constructor TDownloadThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FIdHTTP := TIdHTTP.Create(nil);
  FIdHTTP.OnWork := OnWorkHandler;
end;

procedure TDownloadThread.OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if Terminated then
  begin
    Abort;
    // oder alternativ mit Gewalt die Verbindung kappen
    FIdHTTP.Disconnect;
  end;
end;
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#3

AW: Thread abschießen bei Programmende?

  Alt 22. Dez 2012, 11:47
hi.

try it this way

Delphi-Quellcode:

var ThreadID : Cardinal = 0;


procedure Destroy_Thread(var Thread : TThread);
var
  ForceTerminate : Boolean;
begin
 if not Assigned(Thread) then
  exit;

 if not Thread.Suspended then
  ForceTerminate := True
 else
  ForceTerminate := False;

  Thread.Terminate;
// Thread.Resume; //deprecated
  Thread.WaitFor;
 if ForceTerminate then
  TerminateThread(Thread.Handle, ThreadID);
  FreeAndNil(Thread);
end;
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Thread abschießen bei Programmende?

  Alt 22. Dez 2012, 14:49
WaitFor waits for the thread. He wants to avoid it.
Also, this
Delphi-Quellcode:
if not Thread.Suspended then
  ForceTerminate := True
else
 ForceTerminate := False;
can be shortened to

ForceTerminate := Not Thread.Suspended;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Thread abschießen bei Programmende?

  Alt 22. Dez 2012, 17:17
Wo ich hier grade den Check auf Suspended sehe:
Bitte nie mit Suspend() arbeiten, wenn es sich in irgendeiner Weise verhindern lässt oder man genau weiß, was man tut. MSDN-Library durchsuchenWaitForSingleObject ist hier eine weitaus bessere Lösung.

Ich weiß nicht, ob dieses Problem mitlerweile behoben ist, aber in einigen Delphi Versionen war ein Szenario möglich, in dem der Thread grade Speicher durch den Memory Manager (direkt oder indirekt) angefordert bzw. freigegeben hat, als er suspendiert wurde. Der Memory Manager hatte vorher eine Critical Section oder Ähnliches betreten und durch den Suspend nicht mehr verlassen. Dadurch führte dann jede folgende Speicheralloziierung im Hauptthread sofort zu einem Deadlock.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: Thread abschießen bei Programmende?

  Alt 27. Dez 2012, 14:03
Innerhalb des Threads kann man sich in dem Event OnWork einklinken:
Danke für diesen Tipp! Genau das suchte ich. Hat tadellos geklappt!
  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 14:42 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