Programm reagiert nicht auf Eingabe
-
Hallo Leute!
Habe folgende Situation:
Lasse durch eine for-Schleife Zahlen von 0 bis x in einem Labelfeld ausgeben, das Ganze im Abstand von jeweils einer Sekunde, mit der Sleep(1000).
Das klappt auch, mit Update().Das Problem:
Das Programm reagiert während dieser Zeit nicht auf andere Eingaben.
Habe es mitApplication->ProcessMessages()
probiert. Die Eingabe wurde aber erst nach Beenden der Schleife abgearbeitet.
Habe mir die Beispiele in der FAQ zu "Verzögerungsfunktion" angeschaut und auch fast alles ausprobiert, auch mit Timer. Ohne Erfolg.Wer kann helfen ?
-
Zeig doch mal deinen Code, dann fällt es einem leichter dir zu helfen.
int i = 0; int X = 100; void __fastcall TForm1::Button1Click(TObject *Sender) { for (int i =0; i < X; i++) { Label1->Caption = IntToStr(i); for (int tmp=0; tmp < 50; tmp++) { Application->ProcessMessages(); Sleep(20); } } }
Dieser Code funktioniert - allerdings kann das Programm nicht geschlossen werden solage 'i' != 'X' ist.
Die 2te for Schleife ist dafür da, dass öfters eine ProcessMessage gesendet wird, so dass man nciht merkt dass das Programm hängt.
Allerdings gibt es dafür schönere Lösungen wie z.B. mit dem TTimer.
Da kannst Interval auf 1000 stellen und dann wird alle 1000ms die Aktion ausgeführt.
Einfach einen Counter einbauen und schon hast du eine bessere Lösung.
Is aber immer noch schlecht finde ich, aber da können dir andere bestimtm weiterhelfen.J0
Edit: Achja, die Variabeln sind ausserhalb deklariert, damit man 'i' 'von aussen' auf 'X' stellen aknn und somit die Schleife beendet
P.Post Scriptum: Schneller
-
ich kann mir nciht vorsteleln, warum es mit Timer nicht gehen soll. Viellicht machst du ja was falsch
-
Mein Code:
void __fastcall TForm1::Button1Click(TObject *Sender) { int i; for(i=0;i<6;i++) { Label2->Update(); Label2->Caption=i; Sleep(1000); } }
Kommt aufs Gleiche hinaus.
Das Problem besteht weiterhin.Ich möchte ja gerade das Programm zu einem Zeitpunkt meiner Wahl beenden können, oder anhalten(und anschließend weiterlaufen lassen).
-
Hallo....
Gibt es eine Möglichkeit das Programm zu unterbrechen und anschließend weiterlaufen zu lassen ??
-
Hallo Pilsbaron,
Das Programm unterbrechen und anschließen weiterlaufen lassen wäre eben dieses Sleep(Millisekunden).
Die Sekunden kannst du mit einem Timer leicht zählen. Dein Fehler liegt glaube ich darin, dass du in deinen Tests den Integer i in dem Timer- Prozess ständig neu deklarierst und er somit ständig aufs neue den Wert 0 erhält. Probiere es doch einmal so (habe Code aber nicht getestet):
Der Timer ist in diesem Beispiel zu Beginn Enabled=false.
Weiter hat der Timer ein Intervall von 1000, also 1000 Millisekunden, was deiner Sekunde entspricht.void __fastcall TForm1::Button1Click(TObject *Sender) { int i; i = 0; Timer1->Enabled = true; Button1->Enabled = false; } void __fastcall TForm1::Timer1Timer(TObject *Sender) { if(i < 6) { Label2->Caption=i; i++; } else { Timer1->Enabled = false; Button1->Enabled = true; } }
Ich hoffe ich konnte dir weiterhelfen,
Dein Entertainer
-
void __fastcall TForm1::PAUSEClick(TObject *Sender) { bAbbruch=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::STARTClick(TObject *Sender) { bAbbruch=false; bENDE=false; int i=0; int X=100; while(!bENDE) { while((i<=X) && (!bAbbruch)) { Label1->Caption = IntToStr(i); Application->ProcessMessages(); Sleep(1000); i++; } Application->ProcessMessages(); } ShowMessage("ENDE"); } //--------------------------------------------------------------------------- void __fastcall TForm1::ENDEClick(TObject *Sender) { bENDE=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::WEITERClick(TObject *Sender) { bAbbruch=false; } //---------------------------------------------------------------------------
Ich denke Du suchst so etwas
-
Guten Morgen!
Ja, ein wahrhaft guter Morgen.
Habe genau das gesucht. Das war das Problem.Danke an alle die geholfen haben!
-
Pilsbaron schrieb:
Habe genau das gesucht.
a) Warum sagst du das dann nicht gleich so?
b) Warum nimmst du dir dann nicht den FAQ-Beitrag "Schleife per Button unterbrechen" zu Herzen?
-
Hätte es wohl ein wenig anders formulieren sollen.
Aber man kommt nicht immer sofort auf die beste Lösung.
Habs halt etwas anders ausgedrückt.Werde in Zukunft besser darauf acht geben.