簡體   English   中英

帶有movetothread的qt線程

[英]qt thread with movetothread

我正在嘗試使用線程創建一個程序:主循環開始。 當測試返回true時,我創建一個對象,我希望該對象在另一個線程中工作,然后返回並開始測試。

QCoreApplication a(argc, argv);
while(true){
    Cmd cmd;
    cmd =db->select(cmd);
    if(cmd.isNull()){ 
        sleep(2);  
        continue ;
    }
    QThread *thread = new QThread( );
    process *class= new process ();
    class->moveToThread(thread);
    thread->start();

    qDebug() << " msg"; // this doesn't run until  class finish it's work 
}
return a.exec();

問題是,當我啟動新線程時,主線程停止並等待新線程的完成。

規范的Qt方式如下所示:

 QThread* thread = new QThread( );
 Task* task = new Task();

 // move the task object to the thread BEFORE connecting any signal/slots
 task->moveToThread(thread);

 connect(thread, SIGNAL(started()), task, SLOT(doWork()));
 connect(task, SIGNAL(workFinished()), thread, SLOT(quit()));

 // automatically delete thread and task object when work is done:
 connect(task, SIGNAL(workFinished()), task, SLOT(deleteLater()));
 connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

 thread->start();

如果你不熟悉信號/槽,Task類看起來像這樣:

class Task : public QObject
{
Q_OBJECT
public:
    Task();
    ~Task();
public slots:
    // doWork must emit workFinished when it is done.
    void doWork();
signals:
    void workFinished();
};

我不知道你是如何構建你的進程類的,但這並不是moveToThread的工作方式。 moveToThread函數告訴QT任何槽都需要在新線程中執行,而不是在它們發出信號的線程中執行。 (編輯:實際上,我現在記得它默認為創建對象的步驟)

此外,如果從構造函數在流程類中完成工作,它也不會在新線程中運行。

讓進程類在新線程中執行的最簡單方法是從QThread派生它並覆蓋run方法。 然后你根本不需要調用move to thread。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM