Autor Beitrag
noctua
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Sa 21.05.05 00:28 
wie waers mit
ausblenden Delphi-Quelltext
1:
2:
Sleep(0);
Application.ProcessMessages;

und unter umstaenden nochmal Sleep(0) drann. Dann sollte das schon wesentlich weniger Rechnerbelastend sein...
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Sa 21.05.05 00:41 
also hier mal der ganze code der Schleife


ausblenden volle Höhe 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;

_________________
Am ende sterben eh alle ................
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Sa 21.05.05 00:48 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: 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
ausblenden 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

_________________
Am ende sterben eh alle ................
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 21.05.05 09:35 
Wie lange soll er den warten? Bei z.B. 20 Sekunden würde ich es so machen:

ausblenden 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.