Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Sleep funktioniert nicht


Hendi48 - Di 10.07.07 20:09
Titel: Sleep funktioniert nicht
Hi,
also ich hab das in meinem Programm:

Delphi-Quelltext
1:
2:
3:
reconnect; //procedure die eine bat ausführt
sleep(strtoint(form2.Edit1.text)); //hier soll er eigentlich 2000ms (=20s), macht er aber nich
sammeln; //procedure wird ausgeführt die verschiedene buttons in einer anderen form drückt

Wie schon in den Kommentaren steht, funktioniert das Sleep nicht. Wenn ich mir den Wert mal in einem Label anzeigen lasse (strtoint dann wieder inttostr), zeigt er 2000. Kann es sein das die Zahl in Integer anders ist oder so?


Gausi - Di 10.07.07 20:23

Hast du dich hier verschrieben, oder liegt der Fehler einfach an einer fehlenden 0? 20 Sekunden sind 20.000ms, nicht 2000ms.


Hendi48 - Di 10.07.07 20:41

ohw ja da hab ich was verdreht..ich dachte immer 100ms = 1s :shock:
Danke für die Hilfe

Edit:
Hm, das geht aber trotzdem macht er etwas was erst nach dem sleep kommt zuerst O_o

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure tform3.formsammel;
var
int: integer;
begin
sammeln;
label1.Caption:='1';
sammeln;
label1.Caption:='2';
sammeln;
label1.Caption:='3';
reconnect;
sleep(strtoint(form2.Edit1.text));
sammeln;
int:=strtoint(label1.Caption);
int:=int+1;
label1.caption:=inttostr(int);
end;

nach jedem sammel soll label1 ein hoch gehn, aber es geht auf 4 und dann sleept er erst


Blackheart666 - Di 10.07.07 20:49

Kein Mathe in der Schule gehabt. :wink:
http://de.wikipedia.org/wiki/Vors%C3%A4tze_f%C3%BCr_Ma%C3%9Feinheiten


Hendi48 - Di 10.07.07 20:58

Ich komm erst in die 8. jetz und da hatten wir sowas noch nich, aber warum wir ms noch nich hatten weiß ich auch nich.. :?:
Oben hab ich editiert!


Narses - Di 10.07.07 22:06

Moin!

user profile iconHendi48 hat folgendes geschrieben:
Hm, das geht aber trotzdem macht er etwas was erst nach dem sleep kommt zuerst O_o

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure tform3.formsammel;
var
int: integer;
begin
sammeln;
label1.Caption:='1';
sammeln;
label1.Caption:='2';
sammeln;
label1.Caption:='3';
reconnect;
sleep(strtoint(form2.Edit1.text));
sammeln;
int:=strtoint(label1.Caption);
int:=int+1;
label1.caption:=inttostr(int);
end;

nach jedem sammel soll label1 ein hoch gehn, aber es geht auf 4 und dann sleept er erst

Du hast da zwei Sachen drin, die ich anders machen würde:
1. Du solltest besser Suche in: Delphi-Forum, Delphi-Library GETTICKCOUNT und eine repeat-Schleife mit Timeout nehmen, statt Sleep! :mahn:
2. Der Code da oben ist nicht ereignisorientiert - aber das Programm schon (weil jedes TApplication-basierte Programm ereignisorientiert ist)! Hier gibt´s was aus der FAQ dazu [http://www.delphi-library.de/topic_Ohne+CPULast+auf+Ereignisse+in+Formularanwendungen+warten_67969.html]. :les: ;)

Konkret zu dem aktuellen "Fehlverhalten" (was übrigens keines ist, wenn man den Hintergrund verstanden hat): Mach mal nach dem Ändern der Label-Caption ein Application.ProcessMessages;dann haste auch die Ausgabe. :?

PS: Wenn man Code einrückt, muss man nicht sofort sterben... :roll:

cu
Narses


Hendi48 - Di 10.07.07 22:27

ok danke ich habs jetz so gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm3.SammelManager;
var
  int: integer;
begin
  sammeln;
   label1.Caption:='1';
  sammeln;
   label1.Caption:='2';
  sammeln;
   label1.Caption:='3';
  reconnect;
   Delay(22000);
  Application.Processmessages;
  sammeln;
   int:=strtoint(label1.Caption);
   int:=int+1;
   label1.caption:=inttostr(int);
end;

Ich mach noch ein 5. und 6. dazu und kuck ob es geht..


Sinspin - Mi 11.07.07 00:36

Wenn man den Code so wie du einrückt kann man aber sehr schwehr Krank werden. Zwei Zeichen pro Ebene, nicht mehr und nicht weniger sind voll ok.
Die Verwendung von Delay sollte verboten werden. Frage mich eh wozu man das braucht.
Ich mache mal das was man eigentlich nicht machen sollte, ich schreibe Code: (in schönschrift)

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:
procedure TForm3.SammelManager;
var
  int, l: integer;

begin
  for l := 1 to 3 do
  begin
    sammeln;
    label1.Caption := IntToStr(l);
    Application.Processmessages; // falls in >sammeln< nix drinne ist was appl. procmess. aufruft sieht du sonst keine 
  end;                           // änderung von label1.Caption
  
  reconnect;
  for l := 1 to 22 do // 22 sekunden warten
  begin
    Sleep(1000); // "programm schläft" -> CPU Zeit wird anderen Programmen gegeben
    Application.Processmessages; // programm arbeitet windows botschaften ab -> Es zeigt Windows das es noch lebt
  end;

  sammeln;
  int := StrToInt(label1.Caption);
  Inc(int); // "schöner" als int := int + 1;
  label1.caption := IntToStr(int);
end;


Narses - Mi 11.07.07 00:46

Moin!

@user profile iconSinspin: Dein Code ist zwar besser strukturiert, als der von user profile iconHendi48, aber auch nicht ereignisorientiert und deshalb konzeptionell nicht besser. :? :| :nixweiss:

Das Ganze gehört in einen Timer mit z.B. 1000ms Intervall und über einen Zustand gesteuert. :mahn:

cu
Narses


Hendi48 - Mi 11.07.07 00:52

egal, mein code funktioniert gut und da muss ich auch nix mehr ändern


Sinspin - Mi 11.07.07 16:02

user profile iconNarses hat folgendes geschrieben:
Moin!

@user profile iconSinspin: Dein Code ist zwar besser strukturiert, als der von user profile iconHendi48, aber auch nicht ereignisorientiert und deshalb konzeptionell nicht besser. :? :| :nixweiss:

Das Ganze gehört in einen Timer mit z.B. 1000ms Intervall und über einen Zustand gesteuert. :mahn:

cu
Narses


Bei einem so kleinen stückchen Quelltext, von dem ich absolut nicht weis in welchem Zusammenhang es eingesetzt wird, mache ich mir nicht so den Kopf was davon am besten in einen Timer kommt. Ich habe nur redundanzen beseitigt und einen schönen Programmierstiel demonstriert. Alles weitere überlasse ich der Lern- und Probierbereitschaft des Autors.