Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 25.09.2005, 00:17 Titel: Problem am Programmende |
|
|
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 |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 25.09.2005, 00:29 Titel: Ergänzung |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 25.09.2005, 00:56 Titel: |
|
|
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 |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 25.09.2005, 11:37 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 25.09.2005, 13:58 Titel: |
|
|
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.
jb |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 25.09.2005, 15:02 Titel: |
|
|
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 |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 25.09.2005, 15:30 Titel: |
|
|
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  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 25.09.2005, 16:04 Titel: |
|
|
Klaro bin ich einverstanden
(Ich bin halt erst zufrieden, wenn's nicht mehr schneller, kürzer, eleganter gecodet werden kann - ist ein Leiden, ich weiß )
Im Ernst: Die in deinem Erklärungsartikel enthaltene Kurzfassung vermittelt die Idee natürlich prägnanter.
lG
pinkpanther  |
|
Nach oben |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 25.09.2005, 23:15 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 25.09.2005, 23:26 Titel: |
|
|
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 |
|
 |
|