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
user profile iconnoctua 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();   // Webseite wird geladen

  Statusanzeige('Webseite wird aktualisiert'); //#####DIE STATUS ANZEIGE###########

  while Memo1.lines.count > 0 do
  begin

//    for i := 1 to 10000000 do         // Da es Nicht anders Geht
//      Application.ProcessMessages;   // wird jetzt eine Weile gewartet
Sleep(0);
Application.ProcessMessages;


    WasKlicken := Memo1.Lines[0];   // Liest aus der Memo die erste Zeile
    Memo1.Lines.Delete(0);          // LÖscht die Gelesene Zeile wieder

    Statusanzeige('Liest die erste Zeile aus der Memo: ' + WasKlicken); //#####DIE STATUS ANZEIGE###########

    wasKlickenSkill := StrToSkill(WasKlicken);      // Der gelesene String wird zu skill (neuer typ für array

    Statusanzeige('Das gelesene wird in Skill umgewandelt'); //#####DIE STATUS ANZEIGE###########

    KuserPositionX := uPositionen.Positionen[1,wasKlickenSkill];     // die positioenen
    KuserPositionY := uPositionen.Positionen[2,wasKlickenSkill];     //werden gelesen

    Statusanzeige('Die Position des zugehörigen Skills wird gelesen'); //#####DIE STATUS ANZEIGE###########

    setcursorpos(KuserPositionX,KuserPositionY);                           // hier Klickt die
    mouse_event(MOUSEEVENTF_leftDOWN,KuserPositionX,KuserPositionY,0,0);   // Maus nun auf
    mouse_event(MOUSEEVENTF_leftUP,KuserPositionX,KuserPositionY,0,0);     // Die gewünschte position

//    for i := 1 to 10000000 do         // Da es Nicht anders Geht
//      Application.ProcessMessages;   // wird jetzt eine Weile gewartet
Sleep(0);
Application.ProcessMessages;


    Statusanzeige('Maus Klickt auf gewünschte Position'); //#####DIE STATUS ANZEIGE###########

    SeiteAktualisieren();   // Webseite wird geladen

    Statusanzeige('Webseite wird aktualisiert (2)'); //#####DIE STATUS ANZEIGE###########

    WartenSkillen := StrToInt( ZeitAnzeigen( QuelTextLaden() )  );  // Die zu wartende Zeit wird gelesen

    Statusanzeige('es wird gelesen wie lange gewartet werden muss *wart*'); //#####DIE STATUS ANZEIGE###########

    while WartenSkillen > 0 do
    begin
      Application.ProcessMessages;
    end;
    Statusanzeige('warten ist zuenede und neue zeile wird gelesen'); //#####DIE STATUS ANZEIGE###########

//    for i := 1 to 10000000 do         // Da es Nicht anders Geht
//      Application.ProcessMessages;   // wird jetzt eine Weile gewartet
Sleep(0);
Application.ProcessMessages;


    SeiteAktualisieren();   // Webseite wird geladen

  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

Delphi-Quelltext
1:
2:
//    for i := 1 to 10000000 do         // Da es Nicht anders Geht  
//      Application.ProcessMessages;   // wird jetzt eine Weile gewartet


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//Zeit in ms die er rund warten soll
 while Zeit>0 do
  begin
   sleep(250); //"schläft" 250 ms
   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.