2015-05-13 4 views
0

У меня проблема с QThread. Предположим, я хочу создать класс-поток, что сделает некоторый расчет бесконечным временем. И если я пошлю сигнал, поток остановит вычисление и что-то выполнит.Qthread freezing MainWindow

// Класс-нить

class A: public QThread 
{ 
    protected: 
     void run() { exec(); } 
     public slots: 
     void calc() { while (true) {do somethning}} 
     void display() { display something } 
} 

// Класс Главное окно

class MainWindow 
{ 
    void buttonClick() {emit signalDisplay() } 
} 

// главный файл

void main() 
{ 
    A * a = new A; 
    a->start(); 
    a->calc(); 

    MainWindow w; 
    connect(&w, SIGNAL(signalDisplay()), a, SLOT(display())); 
    w.show(); 
} 

Проблема заключается в том, что если я называю a-> известково() он заморозит приложение. Но я думал, что он работает отдельно? Или я что-то упускаю?

+1

Читайте один из я бесконечных руководств по QThread. Рассказ: не добавляйте слоты в подклассы QThread, иначе у вас появятся проблемы. – peppe

ответ

3

Итак, вы используете второй подход переопределения QThread в своем классе A. Я думаю, вы должны поместить свой код вычисления в функцию run(), а затем просто вызвать a-> start(); Добавьте некоторые сигналы, такие как A :: jobDone (bool success) и т. Д.

Когда вы вызываете свой a-> calc() непосредственно из основного потока, конечно, он будет выполнен в потоке, где вы его назвали .. в этом подходе только функция run() выполняется в другом потоке, и это должно начинаться с a-> start(). Проверьте docs есть хороший пример ..

Существует и другой способ:

class A : public QObject { 
.. 
public slots: 
    void calc(); 
} 


void main() 
{ 
    QThread workerThread; 
    A * a = new A; 
    a->moveToThread(workerThread); 
    a->start(); 

    MainWindow w; 
    connect(&w, SIGNAL(startProcessing()), a, SLOT(calc())); 
    connect(a, SIGNAL(jobFinished(QByteArray)), &w, SLOT(displayInGuiResults(QByteArray))); 
    emit w.startProcessing(); 

    w.show(); 
} 
+0

Он работал с moveToThread :). Большое вам спасибо, вы спасли меня много времени !!!! –