Einsteigerfragen zur PROFAN Programmierung

| Suchen
| Zurück zur Übersicht

Autor | Thema: Warten - Delay unter Profan
Egbert Rudolph
| Datum:27.06.02 12:03 (fahn@freenet.de) |
Wie kann ich ein Profanprogramm anweisen, nach Ablauf einer bestimmten Zeit (z.B.: 10 min) aus sich heraus eine neue Aktion auszuführen? Zwischendurch läuft es im Hintergrund. Der Befehl "@time$(0) eignet sich ja nicht dazu. Unter pascal oder basic gibt es, wenn ich micht nicht irre, so etwas ähnliches (delay). Es soll kein externes Programm genutzt werden.
Jörg Sellmeyer
| Datum:27.06.02 12:08 (joerse@gmx.de) |
Hallo, Du kannst entweder den Befehl Sleep N benutzen oder mit SetTimer N eine Zeitspanne definieren und nach deren Ablauf das Ereignis %wmtimer abfragen: SetTimer 10000 '10 Sekunden WhileNot ende% Waitiinput If ... Elseif %wmtimer Aktion Killtimer 'nicht vergessen ! Endif Wend Gruß Jörg
Egbert Rudolph
| Datum:06.07.02 13:33 (fahn@freenet.de) |
Ja, das prog. mit "Settimer ..." funktioniert einwandfrei. Aber leider nur bis zu 60 Sekunden. Alles was darüber ist, stimmt von der Zeit her nicht mehr. Dabei habe ich schon alles probiert - Datentyp verändern (LongInt, Float, ...) - Multipliz. mit 60 für die Minuten. Alles ohne Erfolg. Hier mein Code, vielleicht habe ich einen Fehler drin und hier meine Umgebung: 1. win 2000 oder 2. win 3.1, beides mit prof. 6.5. proc schlafe parameters n& declare ende% settimer n& let ende% = 0 @showwindow(hd%,2) whilenot ende% waitinput case %wmtimer:let ende% = 1 endwhile killtimer @showwindow(hd%,1) endproc proc ding let ok% = 0 whilenot ok% @SetFocus(he%) waitinput if @getfocus(hb%) let eingabe& = @val(@GetText$(he%)) let eingabe& = @mul(eingabe&,1000) schlafe eingabe& .... Danke, Egbert.
Jörg Sellmeyer
| Datum:06.07.02 20:10 (joerse@gmx.de) |
Hallo Egbert, Dieser leicht modifizierte Code läuft mit Profan 7.5 und 6.6 korrekt. Vielleicht stimmt ja was mit Deiner Eingabeabfrage nicht. Schick doch mal lauffähigen Code zum Testen. Ich schau mal, ob ich 6.5 noch finde. Gruß Jörg
Egbert Rudolph
| Datum:09.07.02 09:06 (fahn@freenet.de) |
Ich hab's noch mal getestet, aber immer mit dem gleichen Fehlerergebnis. Bis ca. 60 s alles i. O., aber dann bei Sekundeneingaben über ca. 100 kommt keine korrekte Zeitmeldung zustande. ' * program Zeitmeldung * declare eingabe&, eingabe$, lw$ declare hd%, hb%, hk%, he%, ok% proc schlafe parameters n& declare ende% settimer n& let ende% = 0 @showwindow(hd%,2) whilenot ende% waitinput case %wmtimer:let ende% = 1 endwhile killtimer @showwindow(hd%,1) endproc proc ding let ok% = 0 whilenot ok% @SetFocus(he%) waitinput if @getfocus(hb%) let eingabe& = @val(@GetText$(he%)) let eingabe& = @mul(eingabe&,1000) schlafe eingabe& ClearList AddFiles @Add$(lw$,"*.wav") Let eingabe$ = @ListBoxItem$(@Rnd(@Add(%GetCount,1))) playsound @Add$(lw$,eingabe$),1 settext he%,"" elseif @getfocus(hk%) let ok% = 1 Endif Endwhile ClearList destroywindow(%hwnd) endproc ' * Hauptprogramm * windowstyle 138 window 10,10-200,110 @showwindow(%Hwnd,0) let hd% = @createwindow(%hwnd,"Wieviele Sekunden?",10,10,200,110) let he% = @createedit(hd%,"",15,20,160,25) let hb% = @createbutton(hd%,"&ok",15,58,40,25) let hk% = @createbutton(hd%,"&end",75,58,40,25) Let lw$ = @Add$(@GetDir$("@"),"\") ding end Auch das kompilierte Programm zeigt diesen Effekt. Liegt es vielleicht daran, daß ich die 16-bit Profan-Variante nutze? Danke Egbert.
Jörg Sellmeyer
| Datum:09.07.02 11:09 (joerse@gmx.de) |
Hallo Egbert, Zur 16-bit Version kann ich nichts sagen. Aber wenn Du nicht zwingend 16-bit brauchst, kannst Du Dir ja die Version 5 als Freeware runterladen. Gruß Jörg
Egbert Rudolph
| Datum:11.07.02 09:08 (fahn@freenet.de) |
Ich bin draufgekommen, woran's liegt: die 16-bit Profan6-Variante übergibt an die Settimer-Funktion generell keine Longinteger sondern nur Integer, selbst wenn der Parameter ein LongI. ist. Damit schaltet nach 65536 Millisekunden die Zeit zurück. Also bis zur 65-ten Sekunde funktioniert mein Code, mit der 66-ten geht's wieder bei 1-er Sek. los. Dieser Sprung kommt nochmal bei 131 Sek. usw. Das Problem versuche ich jetzt zu umgehen, indem ich eine Zähler-Schleife davorschalte, der den übergebenen Wert erstmal abprüft, inwieweit er ein Vielfaches von 65636 ist. Mal sehen, ob ich's hinkriege. Habt Ihr dazu eine Idee? ER
Werner Wagner
| Datum:19.07.02 22:18 |
Hi, es geht auch so: declare t% t% = 0 while 1 if @Equ(t%,z.B. 50000) Dein Befehl endif inc t% wend mfg. Werner
Egbert Rudolph
| Datum:23.07.02 12:01 (fahn@freenet.de) |
Danke. So ähnlich hab ich's auch gemacht. Jetzt funktioniert die Zeitmeldung auf die Minute genau. Was jetzt noch fehlt, ist die Anzeige der vergangenen Zeit in einer "ProgressBar" - Fortschrittsanzeige, damit ich weiß, wielange ich noch am Computer sitzen darf. Ich habe eine solche Progressbar in einem DLL-Demo gefunden, die es mal vor 1-2 Jahren hier runterzuladen gab. Sie hieß Uccntrl.dll. Leider habe ich keine Ahnung, wie ich meinen Wert (die Anzahl der Millisekunden) an diese DLL übergebe, ja, wie ich das Element überhaupt auf meinem Dialogfenster plazieren kann. Ich will jetzt nicht extra noch Pascal lernen. Es ist sicher eine Frage für sich, aber wie definiere ich mir einen Zugriff auf die Botschaften, Fensterklassen und Methoden einer DLL? Egbert
Werner Wagner
| Datum: 23.07.02 22:21 (ww.wbn@t-online.de) |
Hi, schau mal in der Profan Hilfe nach &GetTickCount. Diese Systemvariable ermittelt die Zeit in msec. seit Windows gestartet wurde. Die braucht man nur noch zyklisch abzufragen, entsprechend umzurechnen. Das ganze zieht man von der "Sollzeit" ab und stellt es grafisch dar. Schöner und einfacher kann man es doch nicht haben oder ??? mfg. Werner

| Zurück zur Übersicht

| Ein kostenloses WebMart Forum WebMart Homepage Tools kostenlos |