|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 08.07.2005, 12:21 Titel: ON TIMER-Ersatz |
|
|
Mir ist aufgefallen, dass der Code
Code: |
screen 12
timer on
on timer(1) gosub label
do
print "x";
sleep 1
loop until len(inkey$)
end
label:
cls: print time$
return
|
nicht klappt; direkt in der ersten Zeile meckert freeBASIC:
Zitat: |
Variable required, found: on
|
Inzwischen habe ich rausgefinden, dass es ON TIMER nicht mehr gibt.
Aber wie macht man's dann?
jb |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 08.07.2005, 16:20 Titel: |
|
|
Die TIMER-Funktion existiert immer noch. Alles andere musst du dir wohl oder übel selber schreiben:
Code: | StartZeit = TIMER
DO
IF TIMER >= StartZeit + 1 GOSUB label
'...
LOOP
label:
'...
StartZeit = TIMER
RETURN |
Ansonsten könntest du dich ein bisschen in Richtung API-gestützte Programmierung schlaumachen. Jedes OS hat sein eigenes Timing-System. Vielleicht findest du etwas raus. Normalerweise würde ich dir diese Adresse hier empfehlen:
http://dhost.info/siteofkaos/freeBASIC/WIN-GUI_Grundlagen.html
aber ich bin bis jetzt noch nicht so weit gekommen, mich in das Thema Timer-Funktionen einzulesen...geschweigedenn das entsprechende Tut zu schreiben
Das Codeschnipsel da oben sollte aber relativ gut funzen. Wenn du StartZeit AS SINGLE dimensionierst, hast du sogar eine sehr viel genauere Auflösung als unter QB. Dann musst du aber aufpassen, wenn der Code hinter label: recht zeitintensiv ist.... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 08.07.2005, 20:35 Titel: |
|
|
Es ging mir aber mehr um
und wie man das einmal pro Sekunde realisieren kann.
Also im ganz Allgemeinen um die allseits bekannte Frage
"Wie zeige ich die Uhrzeit unabhängig vom Hauptprogramm an"
und das ganze noch in FB ?
jb |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 11.07.2005, 11:19 Titel: |
|
|
Tja, wie gesagt, solche Funktionen beitet freeBASIC nicht mehr. Interrupts wurden bei der Programmierung des Compilers bis jetzt ausgelassen, und die Entwickler werden es wohl auch in nächster Zeit nicht nachholen...
Mein Codeschnipsel sollte eigentlich genau die Aufgabe übernehmen, die dein QB-Code gebracht hätte...
Bezüglich "Unabhängig vom Hauptprogramm":
Versuchs mal mit
ThreadCreate und ThreadWait
Threadcreate bewirkt, dass eine Sub/Function unabhängig vom Hauptprogramm abläuft, praktisch nebenher... als eigener Thread eben. Threadwait bewirkt, dass die Prozedur wieder in das Hauptprogramm "eingeklinkt" wird.
Bei dem Beispiel zu ThreadCreate musst du evtl. die Zeile
WHILE a<&h7ffffff
etwas anpassen; stell den Wert etwas niedriger ein, da das Prog sonst recht lange dauern kann... Zumindest, wenn dein Prozessor nicht all zu schnell läuft (bei meinen 400 MHz wars auf jeden Fall so...)
In der deutschen Referenz ist dieser Befehl noch nicht Aufgeführt, ich werde das in den nächsten Tagen nachholen _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 11.07.2005, 11:53 Titel: |
|
|
Hm, finde ich ein bisschen kompliziert.
Wie müsste denn das für die Uhrzeit aussehen?
jb |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 11.07.2005, 12:04 Titel: |
|
|
Mal sehen, ob ich das zusammenbekomme....
Code: |
Declare Sub PrintTime (i)
Dim Shared Terminate
i = ThreadCreate(@PrintTime, 0)
Do
' Dein Programm
Loop Until Inkey$=Chr$(27) ' Mit ESC beenden
Terminate = 1
ThreadWait (i)
End
'----
Sub PrintTime (i)
Do
Locate 1,1
Print Time$
Loop Until Terminate
End Sub |
Nicht getestet, sollte aber funzen.
Jetzt laufen die beiden Do-Loops parallel zueinander.
Es wird ständig auf 1,1 die Zeit ausgegeben, gleichzeitig passiert aber das, was im Hauptprogramm innerhalb des Do/Loop läuft.
Wenn ESC gedrückt wird, wird die Bedingung, dass Terminate ungleich null ist, erfüllt. Sobald Die Loop das nächste mal ausgeführt wird, wird PrintTime beendet. Das kann allerdings unter Umständen länger dauern, als das Hauptprogramm läuft. Deswegen wartet ThreadWait, bis das PrintTime wirklich beendet ist.
Was der Parameter i zu bedeuten hat, weiß ich noch nicht genau, ich muss mich selbst noch genauer einlesen; habe nur das Bsp vom engl. Wiki abgeändert. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 11.07.2005, 12:12 Titel: |
|
|
Vielen Dank
Wiki hat Folgendes geschrieben: |
MYARGUMENT is the mandatory integer argument for MYSUB (it can be a dummy argument if no arguments are needed [...]
|
Hm, dann wäre das bei uns wohl einfach ein Dummy-Parameter...
Das war's auch, was mich so verwirrt hat, denn die SUB im Beispiel brauchte ja gar kein i...
jb |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 12.07.2005, 09:11 Titel: |
|
|
Hallo,
das wiki-Beispiel habe ich mir selbst zum besseren Verständnis einmal so abgeändert:
Code: | Dim id As Integer
Sub mythread (dummy As Integer)
b=0
While b<80
Print "*";
Sleep 230
b+=1
Wend
End Sub
Print "Mainprogramm schreibt 80 Punkte."
Print "Thread schreibt 80 mal *"
id = threadcreate(@mythread,0)
Print " Thread gestartet ";
b=0
While b<80
Print ".";
Sleep 100
b+=1
Wend
Print
Print " Thread soll enden, warte: ";
threadwait(id)
Print
Print " Thread beendet"
Sleep |
Abgeänder um die Uhrzeit anzuzeigen:
Code: | Dim id As Integer
Dim Shared TEnde As Integer
Sub mythread (dummy As Integer)
Dim x As Integer, y As integer
While 1
x=Pos
y= CsrLin
Locate 1,70
Print Time$
Locate y,x
Sleep 1000
If TEnde = 1 Then Exit Sub
Wend
End Sub
Print "Thread zeigt Uhrzeit"
Print "Mainprogramm"
TEnde =0
id = threadcreate(@mythread,0)
Print "Thread gestartet ";
b=0
While b<40
Print ".";
Sleep 1010
b+=1
Wend
Print
TEnde = 1
Print "Thread soll enden, warte:"
threadwait(id)
Print "Thread beendet"
Sleep |
Ein echter Ersatz für ON... Gosub ist das nicht.
Die Print Anweisungen können sich bei Überschneidungen gegenseitig beeinflussen, die Uhrzeit macht evtl. auch Spünge > 1sek.
Mit den API-Funktionen SetTimer / KillTimer sollte sich das besser machen lassen aber die wollen bei mir im Console-Mode nicht richtig arbeiten?
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|