Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

ON TIMER-Ersatz

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 08.07.2005, 12:21    Titel: ON TIMER-Ersatz Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 08.07.2005, 16:20    Titel: Antworten mit Zitat

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 peinlich

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 08.07.2005, 20:35    Titel: Antworten mit Zitat

Es ging mir aber mehr um
Code:

on ... gosub

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 ? lächeln

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 11.07.2005, 11:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 11.07.2005, 11:53    Titel: Antworten mit Zitat

Hm, finde ich ein bisschen kompliziert.
Wie müsste denn das für die Uhrzeit aussehen?

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 11.07.2005, 12:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 11.07.2005, 12:12    Titel: Antworten mit Zitat

Vielen Dank lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 12.07.2005, 09:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz