在工作线程中使用QT MainWindow

时间:2017-05-25 11:18:16

标签: c++ multithreading qt

我必须管理由更多udp频道消息更新的MainWindow。此外,读取配置文件,我必须显示或不显示主窗口,如果没有管理/调度/过滤udp消息到另一个应用程序。是否可以定义管理通信的引擎类并更新Mainwindow(如果显示)?我如何管理Mainwindow?也许使用单身人士? 我会做什么(伪代码):

main.cpp中:

            JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("response",response.toString());
                        }
                    }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("error",error!=null?error.getMessage():"unknown error");
                }
            }
            );

Engine.cpp

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

    Engine app();
    app.run();

    return a.exec();
} 

同样在UdpRecvr类中,我会使用MainWindow Singleton。我已经读过使用带有SIGNAL / SLOT的单例是线程安全的。这是一个合适的设计方案吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我通常在MainWindow中启动一个对话线程,并将工作人员的信号连接到窗口的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();
} 

在工作人员中,您可以检查MainWindow是否可见,然后启动SIGNAL,否则与其他应用程序对话。