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:

Problem am Programmende

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



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 25.09.2005, 00:17    Titel: Problem am Programmende Antworten mit Zitat

Hallo!

Folgende Situation: Ein Programm von mir läuft bis zum Ende normal durch und bleibt dann gewollt stehen, damit ich über das Drücken der Leertaste einen Neubeginn des Programms veranlassen kann, um dann neue Zahlenwerte eingeben zu können. Ich habe das so gemacht:

Do
SLEEP
LOOP UNTIL INKEY$ CHR$(32)

Das SLEEP kann man sogar weglassen, aber falls es da überhaupt eine bessere Möglichgkeit gibt, (ohne LOOP), sagt mir das bitte. Das Problem mit dem LOOP ist ja, daß der Prozessor ständig zu 99% ausgelastet ist, solange die Schleife aktiv ist, sodaß ich auf jeden Fall immer erst die Leertaste drücken muß, falls ich mal z.B. zwischendurch online gehen will. Schlimm ist das zwar nicht, aber es muß doch eine Möglichkeit geben, daß das Programm auch dann wieder auf Neubeginn geht, wenn ich NICHT die Leertaste drücke, nämlich automatisch nach z.B. 10 Sekunden vom Programm selber veranlaßt. Ich sehe da keine Lösung. Ihr? Danke für Infos!

QB42


Zuletzt bearbeitet von QB42 am 25.09.2005, 22:47, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 25.09.2005, 00:29    Titel: Ergänzung Antworten mit Zitat

Ich melde mich nochmals wegen einer kleinen Ergänzung, denn mein Text von eben könnte mißverständlich gewesen sein. Es geht mir darum, daß ich zwei Möglichkeiten habe:

1. Ich veranlasse selber über die Leertaste den Neubeginn des Programms.

2. Das Programm soll von sich aus nach z.B. 10 Sekunden den Neubeginn veranlassen, wenn ich nicht selber die Leertaste gedrückt habe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 25.09.2005, 00:56    Titel: Antworten mit Zitat

Hallo

Die Prozessorauslastung hängt eigentlich nicht davon ab, ob das Programm gerade in einer DO...LOOP-Schleife hängt, oder irgend ein anderer Teil bearbeitet wird. Das mit den 10 Sekunden könntest du z.B. so machen:

Code:
...
t = TIMER + 10
DO
LOOP UNTIL INKEY$ = " " OR TIMER > t
...


Funktioniert allerdings nicht in den 10 Sekunden vor Mitternacht. Dafür könnte man aber auch noch eine Sicherung einbauen wenn man wollte.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 25.09.2005, 11:37    Titel: Antworten mit Zitat

Hallo Scilltronic,

hab's ausprobiert und klappt ausgezeichnet. Vielen Dank! Klasse Forum.

Gruß QB42


Zuletzt bearbeitet von QB42 am 25.09.2005, 22:48, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

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

Hallo.

Zum Thema Prozessorauslastung findet sich schnell mit der Boardsuche Abhilfe. Nämlich hier: http://forum.qbasic.at/viewtopic.php?p=16953#16953 zwinkern
Mit dieser Sub namens DoNothing, die du in deine Schleife reintun kannst, reduzierst du die Prozessorauslastung auf wenige Prozent. lächeln

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 25.09.2005, 13:58    Titel: Antworten mit Zitat

Das Mitternachts-Problem kann man mit TIME$ lösen:
Code:

t$ = TIME$
 sekunden = 0
 DO
  IF t$ <> TIME$ THEN
   sekunden = sekunden + 1
   t$ = TIME$
  END IF
 LOOP UNTIL sekunden = 10


Hier wird nur geschaut, ob sich TIME$ (die Uhrzeit im 12:34:56-Format) ändert, was ja auch
jede Sekunde geschieht.
Das ist zwar nicht so genau, aber ob es jetzt 10 1/2 Sekunden sind oder 10 ist ja eigeltlich egal. lächeln

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



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 25.09.2005, 15:02    Titel: Antworten mit Zitat

Oder so:

Code:
...
t = TIMER
DO
dt = TIMER - t
IF dt < 0 THEN dt = dt + 86400
LOOP WHILE INKEY$ <> " " AND dt < 10
...


Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 25.09.2005, 15:30    Titel: Antworten mit Zitat

Zitat:
In Schleifen sollte immer DoNothing eingesetzt werden. Handelt es sich nicht um eine einfache Warteschleife wie im Beispiel, sollte der Parameter ZaehlerAktivieren% auf 0 gesetzt werden. Die Verwendung der Zählvariable ist nur nötig, damit der Interrupt in relativ leeren Endlosschleifen auf schnellen Computern nicht zu oft aufgerufen wird, was in wenigen Fällen auch nicht so gut ist.


Ich verwende das beschriebene Verfahren - in etwas verfeinerter Version - selbst schon länger auf meinem 3,2 GHz-Rechner, allerdings ohne den Einsatz einer "Bremse". --> http://rapidshare.de/files/5515278/TAMEINPT.zip.html
Der angebliche nachteilige Effekt, der auf "schnelleren" Computern auftreten soll, ist mir allerdings noch nicht aufgefallen.

Wenn die Erzeugung von Wartezeiten nötig ist, orientiere ich mich am System-Timer-Zähler (Doppelwort an 0000:046C), wo die Anzahl der seit Mitternacht vergangenen Achtzehntelsekunden gespeichert ist. Diese Methode ermöglicht rechnerunabhängiges "Bremsen", ohne auf aufwändige Gleitkommaarithmetik (TIMER) zurückgreifen zu müssen.

Beispiel:

Code:
DECLARE SUB Warten (Sekunden%)
DECLARE FUNCTION getTimer& ()

CONST MITTERNACHT& = 1573031, TICKS2SEK& = 18

CLS
PRINT "Es ist jetzt "; TIME$; " und wir werden ca. 3 Sekunden warten."

Warten 3

PRINT
PRINT "Um "; TIME$; " geht das Programm weiter und zu Ende."

END

FUNCTION getTimer& STATIC
  DEF SEG = 0
  temp& = PEEK(&H46D) + PEEK(&H46E) * 256&
  temp& = temp& * 256 + PEEK(&H46C) + PEEK(&H46D) * 256&
  getTimer& = temp&
  DEF SEG
END FUNCTION

SUB Warten (Sekunden%)
  Beginn& = getTimer&
  Ende& = Beginn& + Sekunden% * TICKS2SEK&
  DO
    curTime& = getTimer&
    IF Beginn& > curTime& THEN
      curTime& = curTime& + MITTERNACHT&
    END IF
  LOOP WHILE Ende& > curTime&
END SUB



lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 25.09.2005, 15:40    Titel: Antworten mit Zitat

So ist's natürlich korrekter, aber ich wollte versuchen, den kurzen Erklärungsartikel so einfach wie nur möglich zu halten. zwinkern Die Input-Routine mit Verwendung des INTs können wir übrigens gerne mit in den Artikel schreiben, wenn du einverstanden bist. lächeln
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 25.09.2005, 16:04    Titel: Antworten mit Zitat

Klaro bin ich einverstanden lächeln
(Ich bin halt erst zufrieden, wenn's nicht mehr schneller, kürzer, eleganter gecodet werden kann - ist ein Leiden, ich weiß mit den Augen rollen)

Im Ernst: Die in deinem Erklärungsartikel enthaltene Kurzfassung vermittelt die Idee natürlich prägnanter.

lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 25.09.2005, 23:15    Titel: Antworten mit Zitat

Das Mitternachts-Timer-Problem raffe ich erst dann, wenn ich mal irgendwo nachlese, wie der Timer arbeitet. Die Beiträge bleiben ja hier auf dem Forum gespeichert und ich weiß dann jederzeit, wo ich darauf zurückgreifen kann. Also auf alle Fälle vielen Dank für alle Postings!

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 25.09.2005, 23:26    Titel: Antworten mit Zitat

lies hier:

TIMER ist immer die Anzahl der seit Mitternacht vergangenen Sekunden auf 56ms genau (1/18 sek.)


ok?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
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 QBasic. 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