2013-04-25 3 views
1

Я пытаюсь использовать QThread, но я не могу это сделать :( Мой образец резьбы:QThread - проблемы с ним (начинающий)

#include "worker.h" 
#include "mainwindow.h" 
#include <QDebug> 
Worker::Worker() {} 

Worker::~Worker() { 
    qDebug() << "Worker ends."; 
} 

void Worker::run() { 
    qDebug() << "Worker start."; 
    sleep(2); 
    emit finished(); 
} 

И код on_btnStart_clicked():

Worker *worker = new Worker; 
QThread *workerThread = new QThread(this); 
connect(workerThread, SIGNAL(started()), worker, SLOT(start())); 
connect(workerThread, SIGNAL(finished()), worker, SLOT(quit())); 
worker->moveToThread(workerThread); 
workerThread->start(); 

Работник запускается, но никогда не заканчивается (если я закрываю приложение, я получаю QThread: Destroyed while thread is still running. Другая проблема - как я могу передавать данные между потоком и моим приложением? Я хочу использовать QThread для QLabel (пример: таймер). любой хороший учебник, который я могу выполнить без проблем лемы. Кто-нибудь может мне помочь?
И, если я могу спросить, как я могу начать поток, как onCreate() для формы? Я хочу создать простой таймер для подсчета времени запуска приложения.
С уважением

+0

Вы подключаете 'workerThread :: started()' к 'Worker :: start()', но в коде, который вы указали, есть 'Worker :: run()', а не 'Worker :: start()'. Проверьте, возвращает ли 'connect'' true' или 'false'. – Paul

+1

_I не может найти хороший учебник, который я могу выполнить без проблем. Кто-нибудь может мне помочь? Не достаточно ли /примеров/нитей? Кроме того, вы можете захотеть прочитать пометку [Threading Basics] (http://qt-project.org/doc/qt-4.8/thread-basics.html) в qt-проекте. – Paul

+0

@Paul - 'Object :: connect: нет такого слота QThread :: run() в mainwindow.cpp: 22'; at/usr/share/qt4/doc Я ничего не нахожу; в qt-project.org docs я нахожу код как мой, но он не работает; спасибо за ссылку, я попробую это – aso

ответ

0

Вы должны прочитать статью This.

Посмотрите на первый образец кода документации Qt 4.8 QThread. Он имеет много линий плиты котла только для запуска кода в нитке. И есть даже утечка: QThread никогда не собирается уходить и уничтожаться.

Представленный патч принят, но ссылка href он перенаправляет вас на показ старого кода.

This patch snippet diff показывает действительный подход с правой стороны.

В нем показаны оба метода, подклассы QThread и с использованием QObject->Worker Вы можете использовать это как образец для ввода кода. Примените подход, который соответствует вашим требованиям, как он упоминает в блоге.

Смежные вопросы