2017-05-25 39 views
1

我必須管理由更多udp通道消息更新的MainWindow。此外,閱讀配置文件,我必須顯示或不主窗口,如果不管理/派遣/過濾udp消息到另一個應用程序。是否可以定義一個引擎類來管理通信並更新Mainwindow(如果顯示)?我如何管理主窗口?也許使用單身? 我會做什麼(僞代碼):在工作線程中使用QT MainWindow

main.cpp中:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    Engine app(); 
    app.run(); 

    return a.exec(); 
} 

Engine.cpp

Engine::Engine(QObject *parent): 
    QObject(parent) 
{ 
    show_mainwindow = false; 
    thread   = new QThread(); 
    Worker   = new Worker(); 

    // Filter/Dispatch 
    Worker->moveToThread(thread); 
    connect(Worker, SIGNAL(error(QString)), this, SLOT(errorString(QString))); 
    connect(thread, SIGNAL(started()), Worker, SLOT(process())); 
    connect(Worker, SIGNAL(finished()), thread, SLOT(quit())); 
    connect(Worker, SIGNAL(finished()), Worker, SLOT(deleteLater())); 
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
    thread->start(); 

    // Message Receiver (more) 
    UdpRecvr = new Receiver(); 
    connect(UdpRecvr, SIGNAL(receivedMsg(const QByteArray)), udpManager, SLOT(processMsg(const QByteArray))); 

    //Mainwindow Singleton used to update with SIGNAL/SLOT 
    WINDOWINSTANCE = MainWindow::GetInstance(); 

    if(show_mainwindow) 
    { 
     WINDOWISTANCE->show(); 
    } 
} 

此外,在UdpRecvr類我會用主窗口辛格爾頓。我讀過使用帶SIGNAL/SLOT的單身人士是線程安全的。這是一個適當的設計方案嗎? 在此先感謝。

+0

不建議使用線程工作者。如果使用基於任務的線程,則更好(檢查QtConcurrent) – Apin

回答

0

我通常在MainWindow中啓動一個對話線程並將工作人員的SIGNAL連接到窗口的SLOT。

void MainGUI::startServerSockets() { 
    serverSocket = new ServerSocket(cfg_robotPort); 
    //serverSocket->setDebugLevel(debugLevel); 
    ssocketThread = new QThread(this); 
    connect(ssocketThread, SIGNAL(started()), serverSocket, SLOT(run())); 
    connect(ssocketThread, SIGNAL(finished()), serverSocket, SLOT(deleteLater())); 

    connect(serverSocket, SIGNAL(socketRead(const QString &)), this, SLOT(robotSocketRead(const QString &))); 

    serverSocket->moveToThread(ssocketThread); 
    ssocketThread->start(); 
} 

你可以檢查主窗口是可見的,然後上升的信號工人,與其他應用程序,否則對話。