AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Anwendung sauber beenden, während Thread läuft

Ein Thema von DeddyH · begonnen am 3. Feb 2012 · letzter Beitrag vom 4. Feb 2012
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:38
Es ist Fall a). Die Komponente stellt Methoden bereit, um indirekt auf den Thread Einfluss zu nehmen (diese heißen z.B. StopSearch, ContinueSearch, Abort usw.). Die direkte Kommunikation mit dem Thread übernimmt aber die Komponente, da der Thread nach außen gar nicht bekannt ist.
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 Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:40
Ok, wie wäre denn sowas:
Delphi-Quellcode:
type
  TMyThreadComponent = class( TComponent )
  private
    FMyThread : TMyThread;
    FEdit : TEdit;
    procedure SetEdit( const Value : TEdit );
  protected
    procedure DoEvent( const Info : string );
  public
    constructor Create( AOwner : TComponent ); override;
    destructor Destroy; override;
  published
    property Edit : TEdit read FEdit write SetEdit;
  end;


procedure TMyThreadComponent.DoEvent( const Info : string );
begin
  if Assigned( Edit ) and ( Self.ComponentState = [] )
  then
    Edit.Text := Info;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:43
Nützt mir leider nichts, da ich innerhalb der Komponente weder wissen kann noch will, was am Frontend geschieht, sobald ich ein Event auslöse. Ansonsten hätte ich auch FreeNotification oder sowas in Betracht gezogen.
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 Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:47
Nützt mir leider nichts, da ich innerhalb der Komponente weder wissen kann noch will, was am Frontend geschieht, sobald ich ein Event auslöse. Ansonsten hätte ich auch FreeNotification oder sowas in Betracht gezogen.
Du willst und kannst nicht wissen, was am FrontEnd passiert, also wenn das Formular sich im Nirwana auflöst, willst es aber trotzdem wissen?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:51
Du hast mein Dilemma erkannt Ich glaube, ich lasse das jetzt so, dann wird eben in einer README darauf hingewiesen, dass man beim Schließen ggf. noch den Thread anhalten muss. Die Exception tritt sonst evtl. immer noch auf, wird aber ja von mir abgefangen und kommt somit nicht mehr hoch.
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 Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:56
Also ich habe da mal auf die Schnelle zusammengehauen mit dem ComponentState und das funktioniert einwandfrei
Delphi-Quellcode:
procedure TMyThreadComponent.DoEvent( const Info : string );
begin
  if Assigned( Edit ) and ( Self.ComponentState = [] )
  then
    Edit.Text := Info;
end;
Die Komponente hat als Owner das Formular und sobald das Formular in die ewigen Jagdgründe geschickt wird, dann ändert sich erstmal der ComponentState von allen Components, die das Formular als Owner haben. Somit würden also diese Events zwar vom Thread noch aufgerufen aber nicht mehr wirklich bedient.

Und ( Self.ComponentState = [] ) prüft ja auch nicht irgendwas abstruses von ausserhalb ab, sondern den Status deiner eigenen Komponente

EDIT
Hier mal die gesamte Komponente (ist nicht schön und auch nicht wirklich ThreadSafe abgesichert)
Delphi-Quellcode:
unit uMyThreadComponent;

interface

uses
  Classes, Vcl.StdCtrls;

type
  TMyDoEvent = procedure( const Info : string ) of object;

  TMyThread = class( TThread )
  private
    FOnDoEvent : TMyDoEvent;
    procedure SetOnDoEvent( const Value : TMyDoEvent );
  protected
    procedure Execute; override;
    procedure DoEvent;
  public
    property OnDoEvent : TMyDoEvent read FOnDoEvent write SetOnDoEvent;
  end;

  TMyThreadComponent = class( TComponent )
  private
    FMyThread : TMyThread;
    FEdit : TEdit;
    procedure SetEdit( const Value : TEdit );
  protected
    procedure DoEvent( const Info : string );
  public
    constructor Create( AOwner : TComponent ); override;
    destructor Destroy; override;
  published
    property Edit : TEdit read FEdit write SetEdit;
  end;

implementation

uses
  System.SysUtils;

{ TMyThreadComponent }

constructor TMyThreadComponent.Create( AOwner : TComponent );
begin
  inherited;
  FMyThread := TMyThread.Create( True );
  FMyThread.OnDoEvent := DoEvent;
  FMyThread.Start;
end;

destructor TMyThreadComponent.Destroy;
begin
  FMyThread.Terminate;
  FMyThread.WaitFor;
  FMyThread.Free;
  inherited;
end;

procedure TMyThreadComponent.DoEvent( const Info : string );
begin
  if Assigned( Edit ) and ( Self.ComponentState = [] )
  then
    Edit.Text := Info;
end;

procedure TMyThreadComponent.SetEdit( const Value : TEdit );
begin
  FEdit := Value;
end;

{ TMyThread }

procedure TMyThread.DoEvent;
begin
  if Assigned( OnDoEvent )
  then
    FOnDoEvent( FormatDateTime( 'hh:nn:ss.zzz', now ) );
end;

procedure TMyThread.Execute;
begin
  while not Terminated do
    begin
      Synchronize( DoEvent );
      Sleep( 20 );
    end;
end;

procedure TMyThread.SetOnDoEvent( const Value : TMyDoEvent );
begin
  FOnDoEvent := Value;
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 14:04
Du hast mich gerade auf eine Idee gebracht, ich probiere mal etwas aus (mit ComponentState hatte ich auch schon probiert, kann mir aber denken, wo evtl. mein Denkfehler lag).

[edit] Danke für den Schubs in die richtige Richtung. Statt den Thread direkt das Event ausführen zu lassen, benachrichtigt er nun die Komponente, welche zuerst ihren ComponentState prüfen kann und dann das Event auslöst oder eben nicht. So scheint das zu klappen [/edit]
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

Geändert von DeddyH ( 3. Feb 2012 um 14:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 17:37
[edit] Danke für den Schubs in die richtige Richtung. Statt den Thread direkt das Event ausführen zu lassen, benachrichtigt er nun die Komponente, welche zuerst ihren ComponentState prüfen kann und dann das Event auslöst oder eben nicht. So scheint das zu klappen [/edit]
ja, wie denn auch sonst
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 17:41
Das wirklich Lustige daran ist ja, dass ich das bei einem Event bereits genau so gemacht hatte. Wieso bei den anderen nicht, das wird wohl für immer ein Geheimnis meines wirren Hirns bleiben (immer diese Stimmen *huuuu*).
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 haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.083 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 17:48
...oder die Medikamentendosis erhöhen Es gibt aber noch die Möglichkeit das deine Kaffemaschine kaputt ist...
  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 07:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf