Wait() und Keypressed()

Alle Themen rund um die Erstellung von Programmen
Antworten
Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Wait() und Keypressed()

Beitrag von Herbert »

Ich habe im Solarprogramm eine laufende Schlaufe (klar, das Einlesen ab Anlage). Der Benutzer kann das Intervall festlegen. In der Schlaufe der Datenabfrage wird diese Zeit als Parameter für ein Warten geführt.
Gelöst habe ich das mit dem Befehl Multitask, alternativ kann Wait verwendet werden. Multitask als Minuswert im Argument berücksichtigt die ESC-Taste als Abbruchkriterium.

Code: Alles auswählen

		//		Wait(nPoll*100,waitMouseAndKeyboard)
		Multitask(-nPoll*100)
Nun kommen die Probleme: Wie kann ich als Benutzer die Schlaufe unterbrechen?

Code: Alles auswählen

		Multitask()
		IF KeyPressed(kpEscape,False) THEN
			STC_NoName1 = "Esc pressed"
			BREAK
		END
Es brauch nochmals ein Multitask(), welches kurzfrstig Windows die Kontrolle überlässt und so ermöglicht, z.B die Tastatur abzufragen. Abgefragt wird mit Keypressed(). Hier ist ungemein wichtig, dass das 2. Argument (Statusänderung der Tastatur) auf False gestellt wird, sonst wird nur der aktuelle Zustand der Taste abgefragt (ob gerade gedrückt). Hier interessiert aber die letzte Eingabe irgendwann vorher.

Jetzt kommt das 2. Problem: Das Wait wartet. Ohne Unterbrechung! Das Ergebnis: Der User drückt Escape und für die Dauer der Wartezeit passiert nichts, was unschön ist. Möglicherweise ist dies ein Fehler in Windev. Allerdings wird in der Hilfe auch darauf verwiesen, die Wartezeiten möglichst kurz zu halten. Eventuell weiss jemand, womit man dieses Problem umgehen könnte?
Ich habe momentan im Loop zwei Wait mit je der halben Zeit eingebaut.

Nun kommt das 3. Problem: Wenn der User das Programm schliesst, verschwindet das Fenster und alles ist zu - nein! Um die noch verbleibende Wartezeit des noch aktiven Threads bleibt die Task im Taskmanager sichtbar.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Wait() und Keypressed()

Beitrag von BRANDELH »

Hallo Herbert,

wie wäre es mit einer do while Schleife wie in Xbase die Eventloop ?
du verkürzt die wait / multitask zeit auf 1 Sekunde (oder weniger), bleibst aber in der Schleife solange die gewünschte Zeit nicht abgelaufen ist.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Wait() und Keypressed()

Beitrag von Herbert »

Aha.
Du meinst anstelle des WAIT-Befehls den Pseudo-Eventloop aufrufen?
Tönt gut.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Wait() und Keypressed()

Beitrag von Herbert »

Ja, so ist's nun wieder wie es sein sollte. Klick auf ESC und die der Loop wird sofort verlassen (gut nach 2/10 sec)

Code: Alles auswählen

PROCEDURE MyWait(nWait is int=0)
bEsc,breturn are boolean=False
nTemp,nPause are int
Multitask()
IF nWait = 0 THEN 
	RESULT False
END
//if nwait<0 THEN 
//	besc=True
//END
bEsc = True
nPause = 20
nTemp = Abs(nWait)
LOOP
	ThreadPause(nPause)		// 2/10 sec warten
	nTemp -= 20
	IF nTemp<=0 THEN
		BREAK
	END
	IF bEsc AND KeyPressed(kpEscape,False) THEN
		breturn = True
		BREAK
	END
END
RESULT breturn

Antworten