ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 03 Mär 2017, 09:39 
Offline
Nuby

Registriert: 03 Mär 2017, 09:21
Beiträge: 2
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


Zuletzt geändert von Quintus am 03 Mär 2017, 10:53, insgesamt 1-mal geändert.
Code-Tags eingefügt


Nach oben
 Profil  
 
BeitragVerfasst: 03 Mär 2017, 11:09 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
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

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 03 Mär 2017, 12:28 
Offline
Nuby

Registriert: 03 Mär 2017, 09:21
Beiträge: 2
Erstmal vielen Dank für die Hilfe. Ich habe das Problem jetzt mit Hilfe von 2 Threads lösen können.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: