rubyforen.de
http://forum.ruby-portal.de/

Keep Alive Schleife bis ein bestimmtes Zeichen eingegeben wi
http://forum.ruby-portal.de/viewtopic.php?f=22&t=26945
Seite 1 von 1

Autor:  damich2406 [ 03 Mär 2017, 09:39 ]
Betreff des Beitrags:  Keep Alive Schleife bis ein bestimmtes Zeichen eingegeben wi

Hallo, ich bin relativ neu hier in Ruby und stehe vor einem Problem. Ich will eine Schleife mit einem Keep Alive ausführen bis ein bestimmtes Zeichen in die Tastatur eingegeben wird. Die Keep Alive Funktion soll alle 3 Sekunden ausgeführt werden. Wird nach einer unbestimmten zeit eine bestimmte Taste gedrückt,so soll die Funktion abbrechen und zur nächsten Funktion springen. Aussehen soll das ganze in etwa so:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
alive = Alive.new
$t1=Time.now

loop do
t2=Time.now
delta=t2-$t1

if (delta > 3)
$t1=Time.now
alive.alive
my_print("Checking for key input - ".cyan + key.cyan + " -".cyan)
my_print("Enter required key and press key enter".cyan)
end

if (gets != nil)
break if read_keyboard?(key) == key
end
end
end


Das Problem hierbei ist, dass der Funktionsaufruf alive.alive nicht ausgeführt wird, da die Funktion nur bis zur ersten If-Abfrage ( if(gets != nil) läuft und dann unendlich lange wartet bis ein Zeichen eingegeben wird. Nach dem Prinzip des folgenden Programms habe ich es unter anderem schon probiert. Es würde funktionieren, jedoch bricht dann das ganze Programm ab und läuft nicht mehr weiter.



1
2
3
4
5
6
7
8
9
10
11
12
13
# check for exit condition
Thread.new do
loop do
exit if gets.chomp == 'q'
end
end

a = 0
loop do
a += 1
puts a
sleep 1
end


Vielleicht könnt ihr mir ja helfen.
Beste Grüße
Michael

Autor:  Quintus [ 03 Mär 2017, 11:09 ]
Betreff des Beitrags:  Re: Keep Alive Schleife bis ein bestimmtes Zeichen eingegebe

Dein erster Ansatz ist schon gar nicht mal so falsch, aber wie du festgestellt hast, wartet #gets darauf, dass der Nutzer eine Eingabe tätigt. Du brauchst also eine Funktion, die nicht blockt, sondern sofort zurückgibt, wenn keine Eingabe vorliegt. Klassischerweise löst man das mit IO.select. Nimm noch dazu, dass Kernel#gets unter der Haube bloß IO#gets auf $stdin aufruft, hast du auch das dafür notwendige IO-Objekt an der Hand:



1
2
3
4
5
if IO.select([$stdin], nil, nil, 0)
# Okay, es gibt input auf $stdin
else
# Kein Input auf $stdin
end


Eine andere Möglichkeit dürfte IO#read_nonblock sein:



1
2
3
4
5
begin
$stdin.read_nonblock(1)
rescue IO::WaitReadable
# Keine Daten auf $stdin
end


Man kann IO.select und IO#read_nonblock auch kombinieren, um eine möglichst elegante Lösung zu erhalten. Siehe dazu die Dokumentation von IO.select.

Vale,
Quintus

Autor:  damich2406 [ 03 Mär 2017, 12:28 ]
Betreff des Beitrags:  Re: Keep Alive Schleife bis ein bestimmtes Zeichen eingegebe

Erstmal vielen Dank für die Hilfe. Ich habe das Problem jetzt mit Hilfe von 2 Threads lösen können.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/