2016-04-05 2 views
0

Во время выполнения я получаю сообщение об ошибке: «чистая витальная функция называется».QThreadPool называет чистую виртуальную функцию родительского класса QRunnable

QThreadPool, кажется, называют pure virtual void run() родительского класса QRunnable, а не от void run() в производном классе Bm. Как ни странно, если я вызову функцию вручную с помощью b_1.run();, во время работы нет проблем.

Вот мой класс implentation:

class Bm : public QRunnable 
{ 
    public: 
    void run() 
    { 
     test(); 
    } 
    private: 
     void test(); 
}; 

Вот моя главная функция, где происходит ошибка.

int main() 
{ 
    QThreadPool pool; 
    pool.setMaxThreadCount(1); 
    BM b_1; 

    pool.start(&b_1); 

    return 0; 
} 

Мой вопрос: Почему оленья кожа QThreadPool использовать Bm::run() над QRunnble::run()?

+1

Попробуйте вызвать pool.waitForDone() перед возвратом из main(). Похоже, b_1 удаляется до начала потока ... – Archie

+0

Спасибо. Это сработало. как я теперь это сделал? я удаляю вопрос, потому что ответ на мою проблему кажется тривиальным или должен быть опубликованный ответ? – FruitSokrat

+0

Я думаю, что ваш вопрос совершенно верен и может помочь кому-то другому. – Archie

ответ

1

Объекты нити удаляются при выходе из области действия main() еще до звонка QThreadPoolIRunnable::run(). Использование QThreadPool::waitForDone() перед возвратом гарантирует выполнение выполняемого потока.