QT中跨執行緒警告的處理

Happy_Gnu007發表於2020-12-02

問題:

在繼承於QThread的類中, 出現了QUdpSocket成員時,編譯沒有問題, 執行時, 出現Cannot create children for a parent that is in a different thread.

理解:

繼承QThread後在實現run()函式後,new多執行緒物件並傳入this指標---注意此時的this指標是主執行緒的物件.

傳入this指標------相當於在子執行緒裡為主執行緒建立了物件,所以出現跨執行緒警告

另外QT中繼承Qthread類後,在類中定義的物件或或物件的指標都是屬於主執行緒的。次執行緒正真意義上的實體內容實在實現run()函式裡。

所以,要將mythread執行緒裡的物件或指標建立,需要在run()函式裡,建立或分配物件空間。

程式碼:

void Work_Thread::run()
{
    _gClient = new CNCClient(QString("192.168.1.190"), 1001); // _gClient全域性變數,在此處建立就不會跨程式警告
    _gClient->Connect();

    while (m_bStart)
    {
        Position* cmd = popCmd();
        if(NULL != cmd)
        {
            qDebug("ss");
            if(cmd->run(_gClient))
            {
                delete cmd;
                cmd = NULL;
                msleep(100);
            }
        }

        msleep(10);
    }
}

 

相關文章