Autor Beitrag
MKehrer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: Di 23.09.03 08:58 
Hi Delphianer,

ich starte mit Button1 eine Schleife die ich mit Button2 wieder beende.
folgendes funktioniert:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Var running,stoprequest:Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  If running then Exit;
  running:=true; stoprequest:=False;

  repeat
    Application.processmessages;
    until stoprequest;

  running:=false; stoprequest:=false;
  beep;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  stoprequest:=true;
end;


wenn ich aber button2Click folgendermaßen codiere, wird bei keiner Schleife ein Ende gefunden

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button2Click(Sender: TObject);
begin
  stoprequest:=true;
  repeat
    application.processmessages
    Until not running;
end;


Weiß jemand, warum?
Oder weiß jemand eine andere Lösung, damit am Ende von Button2Click die Schleife in Button1Click sicher beendet ist?

_________________
Manfred
Was Du siehst ist in Dir (Smile)
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 23.09.03 09:45 
Setzt du irgendwo in deinem Code nochmal stoprequest:=false; ? Z.B. in einem Timer, oder anderem Thread?

Was du auch noch ausprobieren kannst ist die Code-Optimierung einmal auszuschalten. Ich weiß im Moment nicht, ob der Compiler die globale Variable vielleicht in ein Register auslagert. Sollte das der Fall sein, kannst du das umgehen, indem du stoprequest über eine Funktion abfrägst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function GetStopRequest: Boolean;
begin
  Result := stoprequest;
end;

_________________
Ist Zeit wirklich Geld?
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Di 23.09.03 09:53 
HAllo,

@MKehrer: was du versuchst, ist mehrere Threads zu simulieren. Da kommst du aber so nicht weiter. Dein gedanke, "ein application.processmessages lässt nun die andere prozedur ausführen" ist leider nicht richtig. Du hängst immer noch in deiner schleife von button 2 fest. Die variable stoprequest wird nicht mittels einer windows botschaft verändert, also kann die schleife nicht beendet werden (die, in button2 onclick)
Deine erste variante ist in diesem Fall die einzige funktionierende (ohne threads oder definieren von messages, die anzeigen, daß die variable geändert wurde). Du rufst die schleife auf, und wartest so lange, bis stoprequest true ist. Dazu überprüfst du in jedem Schleifendurchlauf mittels Application.processmessages, ob andere Nachrichten eingetroffen sind und verarbeitest diese. Ein Button.OnClick ist so ein ereignis, was durch eine Nachricht ausgelöst wird. ....

Ich hoffe, ich konnte es halbwegs verständlich erklären.

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
MKehrer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: Di 23.09.03 10:10 
@Ken

Dank Dir, ist ja eigentlich klar.
Ich hab´s jetzt mit SendMessage gelöst.
Leider bin ich dann plattformabhängig.

PS: wie schaut´s mit Kuelschrank.FillupWithBeerBottles aus ? :wink:

_________________
Manfred
Was Du siehst ist in Dir (Smile)