AGB  ·  Datenschutz  ·  Impressum  







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

Wie schließe ich einen schlafenden Thread ?

Ein Thema von MarLe · begonnen am 5. Okt 2012 · letzter Beitrag vom 12. Okt 2012
Antwort Antwort
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#1

Wie schließe ich einen schlafenden Thread ?

  Alt 5. Okt 2012, 10:07
Delphi-Version: XE2
Hallo zusammen,

ich starte einen Thread mit Start und pausiere diesen mit Suspend.
Wenn ich diesen mit Terminate stoppen will bleibt mir der Thread aber erhalten (Taskmanager).
Vorher wieder mit Resume aufwecken und dann stoppen klappt.

Ist das die richtige Vorgehensweise ???

Gruß MarLe

(mir ist bekannt dass Suspend und Resume deprecated sind)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 5. Okt 2012, 10:09
Man legt Threads eben nicht mit Suspend lahm.
Wenn du das nicht mehr machst, dann hat sich dieses Problem automatisch gelöst.

Der Thread befindet sich dadurch in einem unsicheren Zustand, er könnte sogar das ganze Programm lahmlegen, wenn man ihn z.B. anhält, wärend er grade was im MemoryManager erledigt und dadurch die Sperre nicht mehr freigegeben wird.
Und wenn man ihn nun auch noch "hart" abschießen würde, dann bleibt dieser Zustand für immer so, vorallem da der Thread dann nix mehr aufräumen kann, wofür er aber arbeiten müßte.


Fazit:
- du machst das nicht mehr und fertig ist
- oder du läßt den Thread weiterlaufen, sagst ihm "hör auf" und er beendet sich selber
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Okt 2012 um 10:14 Uhr)
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 5. Okt 2012, 11:31
... das weis ich ja dass man Suspend eigentlich nicht mehr verwenden soll.

Ich habe das Demo TThreadObject von Luckie durchgearbeitet (weil es meinen Anforderungen
ähnelt) und da tritt der Fall auf. Habe ansonsten zwar einiges gelesen und teilweise verstanden
wie man es machen soll, aber kein so schönes fertiges Beispiel zum Testen (und erweitern) gefunden.

Gruß MarLe
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 5. Okt 2012, 12:46
Du könntest einen Event nutzen, siehe MSDN-Library durchsuchenCreateEvent, MSDN-Library durchsuchenSetEvent und MSDN-Library durchsuchenResetEvent.
Delphi-Quellcode:
constructor TDingsThread.Create;
begin
  FEvent := CreateEvent(nil, true, true, '');
  inherited;
end;

destructor TDingsThread.Destroy;
begin
  CloseHandle(FEvent);
  inherited;
end;
Im Execute des Threads wartest Du dann auf diesen Event.
while (WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0) and not Terminated do Anhalten geht dann mit ResetEvent, Fortfahren mit SetEvent.
Delphi-Quellcode:
procedure TDingsThread.Pause;
begin
  ResetEvent(FEvent);
end;

procedure TDingsThread.ContinueWork;
begin
  SetEvent(FEvent);
end;
Wenn ich nichts Wesentliches vergessen habe, sollte das so funktionieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 5. Okt 2012, 13:01
Man könnte sich noch vor und nach die Schlaf-Schleife eine Variable platzieren, über welche man extern abfragen kann, ob der Thread grade arbeitet.

z.B. ein LongBool (nach LongInt gecastet), welcher über MSDN-Library durchsuchenInterlockedExchange gesetzt wird. Und abfragen kann man ihn direkt, über ein ReadOnly-Property. (Lesezugriffe sind dort threadsave)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 11. Okt 2012, 15:06
Hallo zusammen,

Danke für die Tipps, habe jetzt mal versucht das Beispiel "quick and dirty" auf Events umzustellen.
Jetzt hängt sich das Ganze im Betrieb auf (keine Rückmeldung).
Beim Debuggen zählt er den Counter noch hoch, aber irgendwas stimmt mit der GUI Synchronisation scheinbar nicht.
Vielleicht hat Jemand Lust sich das mal anzuschauen.

(dass der Zugriff auf TListView nicht threadsicher ist weis ich, darauf werde ich mich anschließend stürzen)

Gruß MarLe
Angehängte Dateien
Dateityp: zip xThread.zip (86,4 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 10. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#7

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 11. Okt 2012, 15:33
Nicht TThread.Execute manuell aufrufen, sondern TThread.Start benutzen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 11. Okt 2012, 15:39
Bzw. TThread.Resume bei Delphi < 2009.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 11. Okt 2012, 16:08
Zitat:
Nicht TThread.Execute manuell aufrufen
Darum ist Execute auch eigentlich als Protected deklariert (strict protected wäre aber besser), damit man eigentlich garnicht erst nicht auf die Idee kommen sollte, dieses von außen direkt aufrufen zu wollen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Wie schließe ich einen schlafenden Thread ?

  Alt 12. Okt 2012, 11:43
Aha, hab ich jetzt so umgesetzt, Danke.
Die Threads springen jetzt an, reagieren aber nicht auf Pause bzw. Stop.
Vielleicht kann noch mal Jemand eine Blick darauf werfen.

Gruß MarLe
  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 15:40 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