Qt5 Qthread
От: milkpot Россия  
Дата: 09.04.19 16:28
Оценка:
Здравствуйте, есть проект на 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().
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.