Entwickler-Ecke
Sonstiges (Delphi) - in 'while' eine weile warten
noctua - Fr 20.05.05 23:19
Titel: in 'while' eine weile warten
ich weiß nich wie ich es machen soll, ich habe eine while-schleife und wärend diser möchte ich nach einer aktion eine weile lang warten.
am anfang hatte ich es mit
Delphi-Quelltext
1:
| Application.ProcessMessages; |
aber gibt es nicht eine andere methode, weil diese irgendwie ziemlich belastend ist (für den rechner).
JRegier - Sa 21.05.05 00:26
Titel: Re: in 'while' eine wile warten
noctua hat folgendes geschrieben: |
ich weiß nich wie ich es machen soll, ich habe eine while-schleife und wärend diser möchte ich nach einer aktion eine weile lang warten.
am anfang hatte ich es mit
Delphi-Quelltext 1:
| Application.ProcessMessages; |
aber gibt es nicht eine andere methode, weil diese irgendwie ziemlich belastend ist (für den rechner). |
Geht's nicht mit Timer oder Thread?
Maweki - Sa 21.05.05 00:28
wie waers mit
Delphi-Quelltext
1: 2:
| Sleep(0); Application.ProcessMessages; |
und unter umstaenden nochmal Sleep(0) drann. Dann sollte das schon wesentlich weniger Rechnerbelastend sein...
noctua - Sa 21.05.05 00:31
und wie lange wird nun geratet? also die '0'? 0 secunden?
ps: es belastet genauso :'( leider
Maweki - Sa 21.05.05 00:34
Theoretisch null Millisekunden. An Sleep wird in Millisekunden uebergeben.
Es funktioniert so.
Ne Schleife wo mehr oder weniger nur Application.ProcessMessages drinne steht ist fuer Windows auch nur eine unbeendete Schleife (ist ja so) und das Programm bekommt deshalb mehr Rechenzeit um die Schleife zu beenden (brauchs ja eigentlich, is ja nur zum Warten).
Und Sleep(0); gibt die aktuelle Zeitscheibe zurueck, gibt also Rechenzeit an andere Programme frei.
Um es mal verkuerzt zu erklaeren...
noctua - Sa 21.05.05 00:38
hmm leider wird er aber genauso belastet, ich kann das programm nicht mal mehr schließen wenn er gerade dabei ist application.ProcessMessages; auszuführen
Maweki - Sa 21.05.05 00:40
hast du beides in ein und derselben Schleife?
Kannst du mal den code schreiben. Kann mir garnich vorstellen, dass die Belastung gleich bleibt...
noctua - Sa 21.05.05 00:41
also hier mal der ganze code der Schleife
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: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| procedure TForm1.Button2Click(Sender: TObject); var WasKlicken : string; var KuserPositionX, KuserPositionY : integer; var wasKlickenSkill :Skills; var i : integer; begin
SeiteAktualisieren(); Statusanzeige('Webseite wird aktualisiert'); while Memo1.lines.count > 0 do begin
Sleep(0); Application.ProcessMessages;
WasKlicken := Memo1.Lines[0]; Memo1.Lines.Delete(0); Statusanzeige('Liest die erste Zeile aus der Memo: ' + WasKlicken); wasKlickenSkill := StrToSkill(WasKlicken); Statusanzeige('Das gelesene wird in Skill umgewandelt'); KuserPositionX := uPositionen.Positionen[1,wasKlickenSkill]; KuserPositionY := uPositionen.Positionen[2,wasKlickenSkill]; Statusanzeige('Die Position des zugehörigen Skills wird gelesen'); setcursorpos(KuserPositionX,KuserPositionY); mouse_event(MOUSEEVENTF_leftDOWN,KuserPositionX,KuserPositionY,0,0); mouse_event(MOUSEEVENTF_leftUP,KuserPositionX,KuserPositionY,0,0); Sleep(0); Application.ProcessMessages;
Statusanzeige('Maus Klickt auf gewünschte Position'); SeiteAktualisieren(); Statusanzeige('Webseite wird aktualisiert (2)'); WartenSkillen := StrToInt( ZeitAnzeigen( QuelTextLaden() ) ); Statusanzeige('es wird gelesen wie lange gewartet werden muss *wart*'); while WartenSkillen > 0 do begin Application.ProcessMessages; end; Statusanzeige('warten ist zuenede und neue zeile wird gelesen'); Sleep(0); Application.ProcessMessages;
SeiteAktualisieren(); end;
end; |
Maweki - Sa 21.05.05 00:48
Delphi-Quelltext
1: 2: 3: 4:
| while WartenSkillen > 0 do begin Application.ProcessMessages; end; |
wo veraenderst du hier den Wert? Das is doch praedistiniert fuer eine Endlosschleife. Und da us uebrigens kein Sleep drinne. Bedenkst du bitte, dass du, solange du keinen extra thread verwendest, das Programm im ganzen anhaellst...
noctua - Sa 21.05.05 00:55
nein das muss nicht sein, ähm ich weiß nicht ob ich dich oder du mich falsch verstanden hast, aber ich möchte nur, dass er bevor er
SeiteAktualisieren(); macht erst eine Weile wartet
und dazu hatte ich ja
da er sonnst nicht mit dem Klicken hinterher kommt
Heiko - Sa 21.05.05 09:35
Wie lange soll er den warten? Bei z.B. 20 Sekunden würde ich es so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var Zeit: Integer; begin ... Zeit:=20000; while Zeit>0 do begin sleep(250); dec(Zeit, 250); Application.ProcessMessage; end; ... end; |
Die 20 Sekunden Wartezeit ist hier wirklich nur rund. Man kann das aber noch genauer machen, was du wahrscheinlich nicht brauchst, bis auf du willst mehr als ne Minute warten. Das Programm kann jetzt aller 250 ms auf Benutzerereignisse reagieren, was ausreichen sollte.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!