Autor Beitrag
SteheAufDerLeitung
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 104



BeitragVerfasst: Mi 25.07.07 08:43 
Servus und guten Morgen!!

Ich hab eine procedure geschrieben, die eine TreeView durchsucht und gewünschte Objekte filtert, also sie in eine Datei schreibt. Beim Startbefehl öffnet sich eine Form mit nem ProgressBar und einem Button zum Abbrechen. Der Filteralgorithmus ist auf dieser neuen Form geschrieben. Soweit so gut..
Mein Ziel: Wenn ich den Abbrechen-Button (auf der neuen Form) klicke, dann soll der FilterProzess abgebrochen werden und sich alles schließen. Problem: Mein Programm reagiert nicht. Der Prozess läuft vollständig ab.

Hab Folgendes auf die ButtonClick-Procedure angesetzt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procdure tDialogConvert.ButtonCancelClick(Sender : TObject);
begin
DlgConvertClosed := true;
Close;
end;


Wenn DlgConvertClosed = true, dann wird in TMainForm.FormActivate(Sender:Tobject) die MainForm geschlossen. Kann man den Click auf den AbbrechenButton priorisieren? Oder was sollte sonst geschehen?
Leuchtturm
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1087

Win Vista, Knoppix, Ubuntu
Delphi 7 Pe, Turbo Delphi, C#(VS 2005 Express), (X)HTML + CSS, bald Assembler
BeitragVerfasst: Mi 25.07.07 08:45 
Vllt helfen Threads. Damit kenne ich mich aber nicht aus. Einfach mal suchen :wink:

_________________
Ich bin dafür verantwortlich was ich sage - nicht dafür was du verstehst.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mi 25.07.07 08:50 
Das Problem ist simpel: Vom Abbruch-Wunsch bekommt NUR das neue Fenster mit dem Abbruch-Button was mit. Das Fenster, das den Treeview-Code enthält, hat davon aber keinen Schimmer.

Du mußt also dem "TreeView-Fenster" irgendwie mitteilen, das die Aktion abgebrochen werden soll. Ich persönlich setze in so einem Progressbar-Fenster eine Variable, die ich zyklisch aus dem anderen Fenster abfrage...

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 25.07.07 08:53 
Moin!

user profile iconSteheAufDerLeitung hat folgendes geschrieben:
Wenn ich den Abbrechen-Button (auf der neuen Form) klicke, dann soll der FilterProzess abgebrochen werden und sich alles schließen.
Problem: Mein Programm reagiert nicht. Der Prozess läuft vollständig ab.

Du brauchst folgendes Konstrukt, da das in der VCL ereignisorientiert abläuft:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var // global
  Continue: Boolean;

procedure Filter;
begin
  Continue := TRUE;
  while (ThingsNotDone and Continue) do begin
    DoSomeThing;
    Application.ProcessMessages;
  end;
end;

procedure ButtonCancelClick;
begin
  Continue := FALSE;

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
SteheAufDerLeitung Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 104



BeitragVerfasst: Mi 25.07.07 09:03 
so hab ich mir das auch gedacht. Nur funktioniert das nicht. Der Progressbar läuft ungestört weiter und lässt gar keinen Klick des Buttons zu. Ich glaub die Idee mit der zyklischen Abfrage ist gar nicht verkehrt..
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 25.07.07 09:07 
Moin!

user profile iconSteheAufDerLeitung hat folgendes geschrieben:
so hab ich mir das auch gedacht. Nur funktioniert das nicht.

Das funktioniert, ganz sicher. ;)

user profile iconSteheAufDerLeitung hat folgendes geschrieben:
Der Progressbar läuft ungestört weiter und lässt gar keinen Klick des Buttons zu.

Allerdings wird dir nur beim Aufruf von APM die "Gelegenheit" gegeben, den Button zu aktivieren. Etvl. ist also diese Aufruffrequenz zu niedrig... :nixweiss:

user profile iconSteheAufDerLeitung hat folgendes geschrieben:
Ich glaub die Idee mit der zyklischen Abfrage ist gar nicht verkehrt..

Das ist doch genau das, was da passiert. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
SteheAufDerLeitung Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 104



BeitragVerfasst: Mi 25.07.07 09:09 
Was ist denn APM? Kann man die Aufruffrequenz ändern oder muss ich die erstmal festlegen??
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Mi 25.07.07 09:12 
APM = Application.ProcessMessages;
Wenn du das nicht einbaust, beansprucht das Programm bis es fertig ist erstmal alle Systemressourcen für sich, die es braucht
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 30.07.07 18:32 
Dieses Problem hatte ich früher auch immer. Mit einer einfachen Variable, wie z.B. Continue, isRunning oder Cancelled könnte man das hinkriegen. Wenn das Programm sofort beendet werden soll, wäre auch Application.Terminate möglich.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 30.07.07 20:45 
Je nach dem wie der Zugriff auf die TreeView aussieht, würde ich das ganze in einem Thread machen. Den Progress-Status übermittelst du an die Form mittels PostMessage und abbrechen kannst du den Thread mit den gegebenen Methoden des Threads (bzw. mit dem property Terminated).

Falls die Operation den Inhalt des TreeViews verändert, könnte dies dein Programm jedoch zum Absturz bringen; Threads können hier also nur bedingt verwendet werden. Falls du nur Sachen in eine Datei schreiben musst, sollte dies gehen.