Autor |
Beitrag |
noctua
      
Beiträge: 170
|
Verfasst: Fr 20.05.05 23:19
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).
_________________ Am ende sterben eh alle ................
Zuletzt bearbeitet von noctua am Sa 21.05.05 00:37, insgesamt 1-mal bearbeitet
|
|
JRegier
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Sa 21.05.05 00:26
Titel: Re: in 'while' eine wile warten
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: 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 
      
Beiträge: 170
|
Verfasst: Sa 21.05.05 00:31
und wie lange wird nun geratet? also die '0'? 0 secunden?
ps: es belastet genauso :'( leider
_________________ Am ende sterben eh alle ................
Zuletzt bearbeitet von noctua am Sa 21.05.05 00:35, insgesamt 1-mal bearbeitet
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: 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 
      
Beiträge: 170
|
Verfasst: 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
_________________ Am ende sterben eh alle ................
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: 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 
      
Beiträge: 170
|
Verfasst: Sa 21.05.05 00:41
also hier mal der ganze code der Schleife
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; |
_________________ Am ende sterben eh alle ................
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: 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 
      
Beiträge: 170
|
Verfasst: 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
Delphi-Quelltext
da er sonnst nicht mit dem Klicken hinterher kommt
_________________ Am ende sterben eh alle ................
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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.
|
|