Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Das Programm und alle Threads sofort beenden?


ralfi - Mo 03.11.03 14:05
Titel: Das Programm und alle Threads sofort beenden?
Hallo!

Ich habe ständig 4 Threads in meinem Programm laufend. Immer wenn ich das Programm beenden möchte, erscheinen diverse Fehlermeldungen. Ich habe schon alles ausprobiert, was hier im Forum geschriben wurde, kein positives Ergebniss.

Kann ich irgendwie das Programm inkl alle Threads sofort beenden und alle mögliche Fehlermeldungen unterdrücken? Denn für mich ist nicht wichtig, was für ein Fehler da erscheint, mir ist wichtig, dass meine Anwendung wirklich beendet ist. Kennt jemand eine Methode?

Danke!


Delete - Mo 03.11.03 14:08

Kuck im OnClose welche Threads noch laufen, beende diese korrekt. Und wenn sie beendet sicht, läßt sich mittels WaitForMultipleObjects festellen, dann rufst du die Methode Close von TForm auf.


ralfi - Mo 03.11.03 15:20

@Luckie

Luckie, danke für deine Antwort, du hilfst mir ja immer, wenn es um Threads geht :-) Danke!

Könntest du mir ein bisschen genauer erklähren, was ich da machen soll, oder vielleicht eine Kode-Beispiel senden, weil ich ja noch praktish ein Anfänger bin... Wäre sehr dankbar!


Delete - Mo 03.11.03 15:33

Puh, Code Beispiel? Hm. Ich habe gerade die neue Version des Threading Tutorials veröffentlicht. da ist auch ein Demo für das VCL Thread-Objekt bei. (Allerdings habe ich da nicht so viel Aufwand getrieben und die noch laufenden Threads gnadenlos abgeschossen. :oops: )


ShadowThief - Mo 03.11.03 16:03

also ich seh das so:

"diverse fehlermeldungen" haben immer ursachen, d. h. diese zu unter-
drücken ist ein denkbar schlechter lösungsansatz.

ich habe in meinen threads eigentlich immer folgenden aufbau:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit unit_TestThread;

interface

uses
  Classes;

type
  TTestThread = class(TThread)
  private
    FQuit: Boolean;
  protected
    procedure Execute; override;
  public
    procedure Quit;
  end;

implementation

{ TTestThread }

procedure TTestThread.Execute;
begin

  FQuit := False;

  repeat

    DoSomething;

  until FQuit;

end;

procedure TTestThread.Quit;
begin

  FQuit := True;

end;

end.


in einer anderen unit hab ich ein objekt dieses threads:


Delphi-Quelltext
1:
2:
var
  FTestThread: TTestThread;


wenn ich das programm schließen will, dann mach ich einfach folgendes:


Delphi-Quelltext
1:
2:
FTestThread.Quit;
FTestThread.WaitFor;


hatte noch keine ernsten probleme damit.
shadow.


Delete - Mo 03.11.03 16:22

Die private Variable FQuit und die Methode Quit kannst du dir sparen. Das Thread-Objekt hat die Eigenschaft Terminated und die Methode Terminate, welche die eigenschaft Treminated auf True setzt.


ShadowThief - Mo 03.11.03 17:41

und was soll ich dann in Execute machen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TTestThread.Execute; 
begin 

  repeat 

    DoSomething; 

  until False; 

end;


?

shadow.


ShadowThief - Mo 03.11.03 17:42

ach jetzt hab ichs :oops:
wahrcheinlich


Delphi-Quelltext
1:
2:
3:
repeat
  DoSometing;
until Terminated;


oder?

(wär gar nicht so dumm)

shadow.


barfuesser - Mo 03.11.03 17:43

Wenn Du das False durch Terminated ersetzt, sollte es auch gehen.

barfuesser