Рабочие темы в рубине - PullRequest
6 голосов
/ 24 ноября 2008

Я пишу простую игру памяти, используя ruby ​​+ qt (пытаясь уйти от c ++ на некоторое время ...)
Чтобы разрешить второй тайм-аут X для просмотра двух открытых частей, мне нужны либо таймеры, либо работа в фоновом потоке.

Какой самый простой способ реализовать это, не изобретая велосипед?
Рубиновые темы? Qt темы? Таймеры Qt?

Ответы [ 3 ]

4 голосов
/ 17 февраля 2009

Я не знаю, является ли это лучшим решением, но:

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)

Заставляет работать рубиновые темы! Отрегулируйте старт (x) для своих нужд.

2 голосов
/ 24 ноября 2008

Решение о выборе потоков / таймеров QT или Ruby, вероятно, является личным, но вы должны помнить, что потоки Ruby имеют зеленый цвет. Это означает, что они реализованы интерпретатором Ruby и не могут масштабироваться на несколько процессорных ядер. Хотя, для простой игры с памятью и таймером, я думаю, вам не стоит об этом беспокоиться.

Хотя и несколько не связанный, Midiator , интерфейс Ruby для MIDI-устройств использует потоки Ruby для реализации таймера .

Также, посмотрите на статью Лесли Вильоена , он говорит, что потоки Ruby блокируются, когда виджеты формы QT ожидают ввода. Он также предоставляет некоторый пример кода для реализации таймеров QT (которые выглядят довольно просто и подходят для того, что вы делаете).

0 голосов
/ 25 ноября 2008

Спасибо.

Решил, используя QTimer :: singleShot. Достаточно - в моем случае срабатывает одноразовый таймер каждый раз, когда отображаются две плитки.

...