Einsteigerfragen zur PROFAN Programmierung
  Suchen
 Zurück zur Übersicht
 AutorThema: Warten - Delay unter Profan
Egbert Rudolph
Datum:27.06.02 12:03 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken  


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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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
Shortwin - denn Glück ist kein Zufall!