Здравствуйте, есть проект на Qt5.6.2 mingw-версии под WinXp, использующий нити Qt. Отладочная версия компилируется и работает.
Релиз версия аварийно завершается при попытке запуска дочерней нити.
#ifndef WORKER2_H
#define WORKER2_H
#include "mainwindow.h"
//class CreatedObject;
class WorkerThread : public QThread
{
Q_OBJECT
bool wait_cnd;
bool lock_cnd;
unsigned long one_and_a_half_hour_wait=5400000;
public:
/*static*/ QMutex mutex;
/*static*/ QWaitCondition wtc_worker2;
void initInnerObjects(/*const CreatedObject *cObjectsPtr*/)
{
//cObject=const_cast<CreatedObject *>(cObjectsPtr);
wait_cnd=false;
lock_cnd=false;
}
explicit WorkerThread(QObject *parent = Q_NULLPTR){}
void run() Q_DECL_OVERRIDE {
QString result;
forever {
//MutexLocker locker(&mutex);
mutex.lock();
qDebug() << "--- Worker: run() func, after lock call";
wait_cnd=wtc_worker2.wait(&mutex,/*5000*/one_and_a_half_hour_wait);
if(false==wait_cnd)
{
continue;
}
else if(true==wait_cnd)
{
result=QString(tr("--- wait_cnd is true"));
do_send_result(result);
}
qDebug() << "--- wait_cnd is " << wait_cnd;
qDebug() << "--- Worker: run() func, after wait call";
mutex.unlock();
}
}
// Q_SIGNAL void resultReady(const QString &s);
public /*slots*/:
void launch_threadfunc()
{
wtc_worker2.wakeOne();
}
signals:
void resultReady(const QString &s);
private slots:
void do_send_result(const QString &info_msg)
{
emit resultReady(info_msg);
}
};
class CreatedObject : public QObject
{
Q_OBJECT
WorkerThread workerThread;
public:
// /*static*/ QWaitCondition wtc2;
~CreatedObject(){
workerThread.quit();
workerThread.wait();
}
void initCreatedObject(MainWindow *window)
{
connect(&workerThread, &WorkerThread::resultReady, window, window->appendtoLogListBox);
connect(&workerThread, &WorkerThread::finished, &workerThread, &QObject::deleteLater);
workerThread.initInnerObjects();
workerThread.start();
}
void wf_wake()
{
workerThread.launch_threadfunc();// wtc_worker2.wakeOne();
}
};
#endif // WORKER2_H
Код который вызывает дочернюю нить
void MainWindow::button8Clicked()// pushButton_8, workerThread initialize
{
QString str;
// str = QObject::tr("Path: ");
if(b_blocking_Value_2==false)
{
createdObj=new CreatedObject();
if(nullptr!=createdObj)
{
qDebug() << "--- Worker: button8Clicked() func, createdObj is not null call";
// createdObj->initCreatedObject(this);
createdObj->initCreatedObject(this);
}
b_blocking_Value_2=true;
}
}
void MainWindow::button9Clicked()// pushButton_9, workerThread wake
{
if(b_blocking_Value_2==true)
{
createdObj->wf_wake();
}
}
Приложение аварийно завершается после выполнения функции button9Clicked().