Методы
Слоты
Описание методов
bool QThread::isRunning ( )
Описание слотов
void QThread::start ( )
void QThread::stop ( )
Примеры
// Создаем новый класс-наследник QObject, объект которого должен будет работать в отдельном потоке
// Назовем его MyWorker (Работник)
class MyWorker extends QObject {
private $button;
private $counts;
private $run;
// в конструктор мы должны передать что-то, с чем будет работать наш поток
// у меня это будет кнопка.
//
// П.с. надеюсь объяснять, что конструктор может иметь абсолютно любую структуру не нужно? =)
// не обязательно что-то передавать вообще, не обязательно передавать именно объект,
// не обязательно вообще создавать конструктор...
// главное - описать функцию этого класса, которая должна будет работать в отдельном потоке
public function __construct($button) {
$this->button = $button;
$this->counts = 0;
}
// эта функция будет вызвана в потоке. Выполняет она следующие действия:
// 1. устанавливает переменную run в значение TRUE, чтобы войти в цикл
// 2. цикл увеличивает счетчик итераций
// 3. цикл записывает значение счетчика в кнопку
public function process() {
$this->run = true;
while ($this->run) {
$this->counts++;
$this->button->text = $this->counts;
usleep(1);
}
}
// функция для остановки цикла
public function stop() {
$this->run = false;
}
}
// Создаем QApplication
$app = new QApplication();
// Создаем форму
$widget = new QWidget();
$widget->show();
// Создаем на форме кнопку
$button = new QToolButton($widget);
$button->show();
// Создаем поток
$thread = new QThread();
// Создаем объект, который будет работать в потоке
// и передаем ему нашу кнопку
$worker = new MyWorker($button);
// Перемещаем нашего "работника" в поток
$worker->moveToThread($thread);
// Соединяем слоты: когда поток стартует, вызываем функцию process() у "работника"
$thread->connect(SIGNAL('started()'), $worker, SLOT('process()'));
// при нажатии на кнопку я хочу чтобы счетчик остановился
// функция stop у "работника" запишет в переменную $run значение FALSE - это обеспечит выход из цикла
$button->connect(SIGNAL('clicked(bool)'), $worker, SLOT('stop()'));
// Так как поток мне больше не нужен, его нужно закрыть. Для это у QThread есть слот quit()
$button->connect(SIGNAL('clicked(bool)'), $thread, SLOT('quit()'));
// Запускаем поток
$thread->start();
$app->exec();
comments powered by HyperComments