6 Stimmen

Worker-Threads in Ruby

Ich schreibe ein einfaches Memory-Spiel mit Ruby + Qt (versuchen, weg von C ++ für eine Weile...)
Um eine X-Sekunden-Zeitüberschreitung für die Anzeige von zwei geöffneten Teilen zu ermöglichen, benötige ich entweder Zeitgeber oder muss die Arbeit in einem Hintergrund-Thread erledigen.

Wie lässt sich dies am einfachsten umsetzen, ohne das Rad neu zu erfinden?
Ruby-Fäden? Qt-Threads? Qt-Zeitgeber?

4voto

Ich weiß nicht, ob das die beste Lösung ist, aber:

block=Proc.new{ Thread.pass }
timer=Qt::Timer.new(window)
invoke=Qt::BlockInvocation.new(timer, block, "invoke()")
Qt::Object.connect(timer, SIGNAL("timeout()"), invoke, SLOT("invoke()"))
timer.start(1)

Bringt Ruby Threads zum Laufen! Passen Sie start(x) für Ihre Bedürfnisse an.

2voto

Chris Lloyd Punkte 11502

Die Entscheidung für QT-Fäden/Zeitgeber oder Ruby-Fäden ist wahrscheinlich eine persönliche Entscheidung, aber Sie sollten bedenken, dass Ruby-Fäden grün sind. Das bedeutet, dass sie vom Ruby-Interpreter implementiert werden und nicht über mehrere Prozessorkerne skalieren können. Für ein einfaches Memory-Spiel mit einem Timer müssen Sie sich darüber aber wahrscheinlich keine Gedanken machen.

Auch wenn es damit nicht viel zu tun hat, Midiator eine Ruby-Schnittstelle zu MIDI-Geräten verwendet Ruby-Threads zur Implementierung eines Zeitgebers .

Werfen Sie auch einen Blick auf Der Artikel von Leslie Viljoen sagt er, dass Rubys Threads blockieren, wenn QT-Formular-Widgets auf Eingaben warten. Er bietet auch einige Beispielcode, um QT-Timer zu implementieren (die ganz einfach und angemessen für das, was Sie tun, aussehen).

0voto

Danke.

Gelöst mit QTimer::singleShot. Ausreichend - in meinem Fall, feuert eine einmalige Timer jedes Mal, wenn zwei Fliesen angezeigt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X