Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi delphi ist einfach zu schnell und überspringt teilweise code (https://www.delphipraxis.net/2323-delphi-ist-einfach-zu-schnell-und-ueberspringt-teilweise-code.html)

Helmut 17. Jan 2003 22:32


delphi ist einfach zu schnell und überspringt teilweise code
 
Hio,

vielleicht kennt ihr das Problem. Delphi scheint bei manchen prozeduren einfach nicht zu warten bis diese fertig ausgeführt worden sind, sondern geht einfach weiter im code.

Ein Beispiel ist zum beispiel diese zeile:
Delphi-Quellcode:
begin
image1.picture.loadfromfile('1.bmp');
showmessage('Bild noch nicht sichtbar!');
end;
Hier würde, wenn die message erscheint noch kein bild geladen sein.
Jedanfalls hängen damit viele probleme in meinem Programm zusammen. je langsamer der PC, desto öfter treten fehlermeldungen auf.
Ich kanns nur schlecht beschreiben, weil ich es selber nicht richtig verstehe.

Gibt es eine möglichkeit, timer zu verwenden um das programm nur kurz anzuhalten?
Vielleicht in der art:
timer1.enabled;
if timer1.notify then mache weiter...

Der delay-befehl der hier im forum zu finden ist nützt mir ja nicht viel, da er ja alles komplett anhält. Nebenbei scheint er auch nicht zu funktionieren. (delphi meckert das longint irgendwie nicht kompatibel ist...). Ausserdem würde delay mein programm bestimmt noch instabiler machen... (?).

Wenn jemand ne idee hat wie man das mit nem timer (oder was anderem) machen könnte wär ich sehr dankbar.

mfg
Helmut[/code]

Christian Seehase 17. Jan 2003 22:36

Moin Helmut,

also nachvollziehen kann ich Dein Problem leider nicht, allerdings sollte der Delay aus der Library einwandfrei funktionieren ohne das Programm anzuhalten. Angehalten würde es nur, wenn Du Sleep verwendest.

sakura 17. Jan 2003 22:40

Re: delphi ist einfach zu schnell und überspringt teilweise
 
Die rote Zeile sollte Dein Problem lösen. Das Bild ist zwar schon geladen, jedoch wurde die Nachricht dass Bild darzustellen noch nicht verarbeitet. Ein Aufruf von Application.ProcessMessages; arbeitet die Nachrichtenschleife ab.
Code:
begin
image1.picture.loadfromfile('1.bmp');
[color=#ff0019]Application.ProcessMessages;[/color]
showmessage('Bild noch nicht sichtbar!');
end;
...:cat:...

Daniel B 17. Jan 2003 22:41

Hallo Helmut,

vielleicht bringt Dich Application. ProcessMessages weiter.
Ansonsten kannst Du anstatt mit Delay oder Sleep, mit GetTickCount arbeiten. Wobei ich Dein Problem nicht so richtig verstehe. Denn die Zeile werden eigentlich schon der reihe nach abgearbeitet.

Grüsse, Daniel :hi:

Helmut 17. Jan 2003 23:59

Hi,

ob ihrs glaubt oder nicht, application.ProcessMessages hilft!
Mein programm stürtzt nichtmehr ab.

Allerdings muss ich dazu sagen das es ohne das etwa alle 50 mal abstürtzte(bzw. einen fehler machte). Ich hab jetzt ca. 80 mal probiert und der fehler kam noch nicht (der fehler bringt das programm nicht zum abstürtzen, aber es macht etwas was es nicht soll...).

Der einzige nachteil bei dem befehl application.ProcessMessages scheint bei mir darin zu liegen, das wenn ich nach dem testen des spiels (compilieren) in delphi zurückkehre sind meine ganzen Forms mit weissen streifen überzogen.
Der befehl wird im programm ca. 20 mal in einer sekunde aufgerufen (nur eine sekunde lang :) ).
Vielleicht ist das etwas zuviel für windows...

Um nochmal auf den befhel delay zurückzukommen:

Ich erhalte ziemlich viel fehler beim kompilieren. ich hab schon verschiedene delay-varianten ausprobiert. bei dme delay aus dem forum hier
Delphi-Quellcode:
procedure delay(msec:longint);
var
  start,stop:longint;
begin
  start := gettickcount;
  repeat
  stop := gettickcount;
  application.processmessages;
  until (stop - start ) ›= msec;
end;
erhalte ich diese meldung:
Ungültiges Zeichen in Eingabedatei: '&' ($26)
an der stelle:
until (stop - start ) ›= msec;

:(

Daniel B 18. Jan 2003 00:14

Hallo Helmut,

Zitat:

Zitat von Helmut
erhalte ich diese meldung:
Ungültiges Zeichen in Eingabedatei: '&' ($26)
an der stelle:
until (stop - start ) ›= msec;

Logisch. Ist ja auch Falsch. Delphi ist kein Internet Browser. ;)

Sollte > heissen. Also grösser! bzw. "until (stop - start) >= msec;"

Grüsse, Daniel :hi:

Helmut 18. Jan 2003 08:47

ahh, super, und delay ist ja ein richtig schöner befehl :) (ich vermisse die alten pascal-zeiten :mrgreen: )

danke :)

Daniel B 18. Jan 2003 09:50

Hallo Helmut,

Zitat:

Zitat von Helmut
ahh, super, und delay ist ja ein richtig schöner befehl

<klugschei*>Naja, eigentlich eher eine schöne, selbsterstellte Prozedur.<klugschei**>

In Delphi gibt es Sleep(Zeit);.
Das Problem bei dem ist, das alle Threads des Programmes einfrieren und somit das ganze Programm im Prinzip steht.
Bei der Delay-Prozedur, läuft aber alles schön weiter wie es sich gehört.

Grüsse, Daniel :hi:

Hansa 18. Jan 2003 11:02

Hi,

Zitat:

Zitat von Helmut
Allerdings muss ich dazu sagen das es ohne das etwa alle 50 mal abstürtzte(bzw. einen fehler machte). Ich hab jetzt ca. 80 mal probiert und der fehler kam noch nicht (der fehler bringt das programm nicht zum abstürtzen, aber es macht etwas was es nicht soll...).

Du meinst doch mit "abstürzen" nicht etwa, daß der Compiler einen Fehler bringt ? Das würde vieles erklären. Ansonsten verstehe ich nicht, was Du da machst.

Gruß
Hansa

Christian Seehase 18. Jan 2003 15:15

Moin Daniel,

noch ein klein Wenig zu Sleep:

Sleep ist eine Funktion der Windows API aus der KERNEL32.DLL, ausserdem werden damit nicht alle Threads eines Prozesses angehalten, sondern nur der in dem die Funktion aufgerufen wird.

Helmut 18. Jan 2003 15:20

Zitat:

Zitat von Hansa
Hi,

Zitat:

Zitat von Helmut
Allerdings muss ich dazu sagen das es ohne das etwa alle 50 mal abstürtzte(bzw. einen fehler machte). Ich hab jetzt ca. 80 mal probiert und der fehler kam noch nicht (der fehler bringt das programm nicht zum abstürtzen, aber es macht etwas was es nicht soll...).

Du meinst doch mit "abstürzen" nicht etwa, daß der Compiler einen Fehler bringt ? Das würde vieles erklären. Ansonsten verstehe ich nicht, was Du da machst.

Gruß
Hansa

nein, kein compilerfehler. Dann wüsste ich ja das ich falsch programmiert hätte.

Ein und die selbe prozedur macht ein mal etwas anderss was es soll, wenn ich dann kurz warte, diese funktion nochmal mit den gleichen werten aufrufe dann klappt es wieder. Aber im laufenden programm wenn alle prozeduren schnell hintereinander abgearbeitet werden funzt diese iene prozedur halt in sehr seltenen fällen nicht. Einzeln aufgerufen funktioniert sie immer :(

Mit delay klappt das aber sehr schön, deswegen werd ich mich mit sleep nciht weiter beschäftigen...

Christian Seehase 18. Jan 2003 15:29

Moin Helmut,

Sleep macht eigentlich auch nur Sinn, wenn man in seinem Programm weitere Threads erzeugt, und diese, aus welchen Gründen auch immer, mal anhalten will bzw. muss.
Im Hauptprogramm hat diese Funktion ansonsten eigentlich nicht viel zu suchen, da ein Benutzer sonst leicht den Eindruck haben kann, dass sich das Programm aufgehängt hat (was im Prinzip zwar auch richtig wäre, denn es reagiert nicht mehr, allerdings wäre dieses "Aufhängen" ja gezielt gesteuert).

Helmut 18. Jan 2003 16:39

aha, ok :)

gestern sass ich irgendwie zu lange an meiner KI.. ich hab geträumt das ich einen fehler in meinem Code hatte und gestorben bin (ich bin durch ein loch gefallen und dann aufgewacht).
Wollte ich nurmal nebenbei loswerden... finde das echt krass :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz