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:

Etwas anders als Sleep vewenden.

 
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
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 17.01.2015, 10:30    Titel: Etwas anders als Sleep vewenden. Antworten mit Zitat

Hallo, guten Tag.

Ich frage in einer Loop ab, ob über seriell:
Code:
If Loc(dnr1) > 0 Then   
Get #dnr1, , empfang_byte   
Print Str(empfang_byte)
End If

ein Byte empfangen wird mit 19200 Baud.

In der Loop habe ich ein " Sleep 1" um anderen Arbeiten Zeit zu geben.
Wiekann ich dieses Sleep ersetzen das die vollen 19200Baud empfangen werden ? Bei Sleep 1 mit 19200Baud kommen ja nur ca 1000 Byte an pro Sekunde, ohne Sleep würden es ca 1900 Byte sein.

Was kann ich da bitte reinsetzen?

danke.

Gruss

Code:

Do
   taste = InKey
   IF taste = CHR(255, 107) THEN End
   
   If MULTIKEY(FB.sc_1) Then
      View PRINT 1 TO 14
   Color &hff0000,RGB(240,240,240)
   Cls
   Locate 2,2
   Print "1 = Datei laden"
   Locate 4,2
   Print "2 = Byte senden"
   Locate 13,2
   Print "Byte empfang :"

      datei_laden()
      Locate 8,2
      Print "geladen : "+datei
     
      View PRINT 16 TO 50
      Color &h00ff00,RGB(0,0,0)
      Cls
   EndIf
   If MULTIKEY(FB.sc_2) Then
        If datei >"" Then
   byte_senden()
        EndIf
   EndIf 
   
   If Loc(dnr1) > 0 Then   
      Get #dnr1, , empfang_byte   
   Print Str(empfang_byte)
   End If
   
   Sleep 1
Loop
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4700
Wohnort: ~/

BeitragVerfasst am: 17.01.2015, 12:47    Titel: Antworten mit Zitat

Ich schätze mal, wenn du regelmäßig die Kontrolle an den Prozessor abgeben willst, wird das den eigenen Prozess nun einmal runterbremsen. Daran wird eine alternative Möglichkeit, die Kontrolle an den Prozessor abzugeben, naturgemäß nichts ändern können.

Du könntest aber einen Schleifenzähler mitführen und das SLEEP z. B. nur bei jedem 100. Durchlauf aufrufen. Das sollte den eigenen Prozess nicht so stark herunterbremsen und anderen Prozessen trotzdem noch Arbeitszeit einräumen. Muss man halt ein bisschen experimentieren, welcher Wert da geeignet ist.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 17.01.2015, 15:25    Titel: Antworten mit Zitat

Jup danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 17.01.2015, 19:58    Titel: Antworten mit Zitat

du solltest wohl versuchen, nicht Byte fuer Byte vom Seriellen Port zu lesen, sondern stattdessen lieber seltener groessere Bloecke abfragen, wenn das moeglich ist.

Ausserdem solltest du blockierende Systemaufrufe zum Einlesen verwenden anstatt zu pollen. Damit kannst du bequem so viel lesen wie du willst, und solange dein Programm auf daten vom Seriellen Port wartet, kriegt eh ein anderes Programm die Rechenzeit zugeteilt.

Wenn du allerdings dann in der Hauptschleife noch etwas anderes tun willst, z.B. auf Benutzerinteraktion warten, dann koennte man das mit mehreren Threds realisieren, das koennte aber zu weit fuehren wenn du mit dem Konzept nicht vertraut bist.
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 17.01.2015, 21:30    Titel: Antworten mit Zitat

Unter Linux und in C würde ich typischerweise für so etwas select() verwenden. select() hat die Aufgabe, einen Prozess schlafen zu legen, bis auf irgend einem Dateideskriptor (z.B. TCP/IP-Socket, Tastatur, serieller Port usw.) Zeichen zum Abholen vorliegen.

Details (nur Linux):
Code:
man 2 select


Wäre vielleicht für FB auch einmal ein sinnvoller Feature Request, dass ich mit OPEN auch beliebige Ressourcen gleichzeitig öffnen und Prozess schlafen legen könnte, bis eine beliebige Eingabe vorliegt.

Mit den jetzigen Möglichkeiten einen Versuch wert: Je ein Thread für jede Ressource bereitstellen, also einer, der nur ständig Zeichen am COM-Port abfragt, ein anderer, der die Tastatur bedient usw. => bedingt ein Arbeiten mit Mutexe für den kritischen Abschnitt, wo auf die gemeinsamen Variablen zugegriffen wird.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 19.01.2015, 20:44    Titel: Antworten mit Zitat

du könntest ja auch einfach alles so machen, wie bisher. Allerdings beim empfang eines bytes eine do-loop laufen lassen, bis nichts mehr im speicher liegt.

alternativ wäre z.B. auch eine möglichkeit mit einem timer() zu arbeiten.

http://ops.deltalabs.de/code?id=14


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 20.01.2015, 12:52    Titel: Antworten mit Zitat

@TPM
Zitat:
alternativ wäre z.B. auch eine möglichkeit mit einem timer() zu arbeiten.
Gute Idee!
Deine Einschätzung der Durchläufe in deinem Beispiel ist allerdings nicht richtig.
Mit einer recht lahmen CPU komme ich auf wesentlich höhere Werte.
Code:
Dim lauf As Integer
Dim As Double zeit, zeit1 = Timer +1.0
Do
  If zeit <= Timer Then 'ohne Timer 66 Durchlaeufe pro sek.
    Sleep 1,1 'entlastet die CPU
    'zeit = Timer + 0.001 'ca.  15100 Durchlaeufe pro sek.
    zeit = Timer +  0.01 'ca. 150000 Durchlaeufe pro sek.
    'zeit = Timer +   0.1 'ca. 220000 Durchlaeufe pro sek.
  End If
  lauf +=1
Loop While zeit1 >= Timer
? lauf
Sleep

_________________
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
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 20.01.2015, 13:40    Titel: Antworten mit Zitat

joar ... das war damals n denkfehler ... die werte sind nicht so einfach abzuschetzen, da man die leistung der cpu ja nicht kennt *g*

werd ich mal bei gelegenheit editieren *gg*


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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