Информация об изменениях

Сообщение Re: Qt5 Qthread от 10.04.2019 6:55

Изменено 10.04.2019 7:06 Igore

Re: Qt5 Qthread
Здравствуйте, milkpot, Вы писали:

M>Здравствуйте, есть проект на Qt5.6.2 mingw-версии под WinXp, использующий нити Qt. Отладочная версия компилируется и работает.

M>Релиз версия аварийно завершается при попытке запуска дочерней нити.
Чего в отладчике, чего в логах и т.д. Вообще я бы переписал это приблизительно так
  Скрытый текст
ifndef WORKER2_H
#define WORKER2_H

#include "mainwindow.h"
//class CreatedObject;

class WorkerObject : public QObject
{
    Q_OBJECT

public:
    explicit WorkerObject(QObject *parent = Q_NULLPTR) : QObject( parent ){}
   // Q_SIGNAL void resultReady(const QString &s);
public /*slots*/:
    void launch_threadfunc(QString string)
    {
        QMetaObject::invokeMethod(this,"do_send_result",Qt::QueuedConnection,Q_ARG(QString,string));
    }
signals:
    void resultReady(const QString &s);


public slots:
    void do_send_result(const QString &info_msg)
    {
        emit resultReady(info_msg);
    }
};


class CreatedObject : public QObject
{
    Q_OBJECT

    QThread workderThread;
    WorkerObject workerObject;
    
public:
   // /*static*/ QWaitCondition wtc2;

    ~CreatedObject(){
        workerThread.quit();
        workerThread.wait();
    }

    void initCreatedObject()
    {
            workerObject.moveToThread(&workderThread);
            workerThread.start();
    }
    void wf_wake()
    {
        workerThread.launch_threadfunc("should return from thread");// wtc_worker2.wakeOne();
    }

};


MainWindow::MainWindow() 
    : QMainWindow()
    , createdObj( new CreatedObject( this ) )
{
    connect(&createdObj, &WorkerObject::resultReady, this, &MainWindow::appendtoLogListBox);
    createdObj->initCreatedObject();
}

void MainWindow::button8Clicked()// pushButton_8, workerThread initialize
{
    QString str;
 //   str = QObject::tr("Path: ");
    if(b_blocking_Value_2==false)
    {
            qDebug() << "--- Worker: button8Clicked() func, createdObj is not null call";
       //     createdObj->initCreatedObject(this);
        b_blocking_Value_2=true;
    }
}

void MainWindow::button9Clicked()// pushButton_9, workerThread wake
{
    if(b_blocking_Value_2==true)
    {
        createdObj->wf_wake();
    }
}
Re: Qt5 Qthread
Здравствуйте, milkpot, Вы писали:

M>Здравствуйте, есть проект на Qt5.6.2 mingw-версии под WinXp, использующий нити Qt. Отладочная версия компилируется и работает.

M>Релиз версия аварийно завершается при попытке запуска дочерней нити.
Чего в отладчике, чего в логах и т.д. Вообще я бы переписал это приблизительно так
А ис того что написано connect(&workerThread, &WorkerThread::resultReady, window, window->appendtoLogListBox); вызывает вопросы, почему не
connect(&workerThread, &WorkerThread::resultReady, window, &MainWindow::appendtoLogListBox);
  Скрытый текст
ifndef WORKER2_H
#define WORKER2_H

#include "mainwindow.h"
//class CreatedObject;

class WorkerObject : public QObject
{
    Q_OBJECT

public:
    explicit WorkerObject(QObject *parent = Q_NULLPTR) : QObject( parent ){}
   // Q_SIGNAL void resultReady(const QString &s);
public /*slots*/:
    void launch_threadfunc(QString string)
    {
        QMetaObject::invokeMethod(this,"do_send_result",Qt::QueuedConnection,Q_ARG(QString,string));
    }
signals:
    void resultReady(const QString &s);


public slots:
    void do_send_result(const QString &info_msg)
    {
        emit resultReady(info_msg);
    }
};


class CreatedObject : public QObject
{
    Q_OBJECT

    QThread workderThread;
    WorkerObject workerObject;
    
public:
   // /*static*/ QWaitCondition wtc2;

    ~CreatedObject(){
        workerThread.quit();
        workerThread.wait();
    }

    void initCreatedObject()
    {
            workerObject.moveToThread(&workderThread);
            workerThread.start();
    }
    void wf_wake()
    {
        workerThread.launch_threadfunc("should return from thread");// wtc_worker2.wakeOne();
    }

};


MainWindow::MainWindow() 
    : QMainWindow()
    , createdObj( new CreatedObject( this ) )
{
    connect(&createdObj, &WorkerObject::resultReady, this, &MainWindow::appendtoLogListBox);
    createdObj->initCreatedObject();
}

void MainWindow::button8Clicked()// pushButton_8, workerThread initialize
{
    QString str;
 //   str = QObject::tr("Path: ");
    if(b_blocking_Value_2==false)
    {
            qDebug() << "--- Worker: button8Clicked() func, createdObj is not null call";
       //     createdObj->initCreatedObject(this);
        b_blocking_Value_2=true;
    }
}

void MainWindow::button9Clicked()// pushButton_9, workerThread wake
{
    if(b_blocking_Value_2==true)
    {
        createdObj->wf_wake();
    }
}