0

我正在编写一个聊天客户端,我想在 MainWindow 中显示消息,例如 displayTextEdit->append(string); 但我正在使用 DWORD 线程。

这样做的方法是什么?我不知道,如何将此线程与 Mainwindow 连接,有什么想法吗?

DWORD WINAPI RECV_MESSAGE(int &s) //&s is a socket, from winsock2
{ 
    gg_header header; // incoming packet type
    gg_recv_msg in;   // text and user

    for(;;)
    {
        ::recv(s,(char*)&header,sizeof(header),0);
        if(header.type==RECV_MSG)
        {
            ::recv(s,(char*)&in,sizeof(in),0);

            QString string(in.message);
        }
    }
    return 0;
}

在 MainWindow 中创建线程:

CreateThread(NULL,1024,(LPTHREAD_START_ROUTINE) &RECV_MESSAGE,&s,0,NULL));
4

2 回答 2

0

考虑创建一个 QObject 派生类,您的通信线程可以使用它与您的主窗口进行通信。

class CommSignaller : public QObject
{
    Q_OBJECT
signals:
    SendMessage(const QString &msg);
public:
    Message(const QString &msg)
    {
        emit SendMessage(msg);
    }
}

将主窗口指针传递给线程函数,然后将 CommSignaller SendMessage 信号连接到主窗口中的插槽。使用 QObject::connect 的默认连接类型,这种通信本质上是线程安全的。

于 2012-05-16T21:22:04.707 回答
0

在您的窗口中声明将 QString 作为参数并对其进行处理的插槽。像这样使用 QMetaObject::invokeMethod:

DWORD WINAPI RECV_MESSAGE(int &s) //&s is a socket, from winsock2
{ 
    QObject *ptrToWindowClass;
    gg_header header; // incoming packet type
    gg_recv_msg in;   // text and user

    for(;;)
    {
        ::recv(s,(char*)&header,sizeof(header),0);
        if(header.type==RECV_MSG)
        {
            ::recv(s,(char*)&in,sizeof(in),0);

            QString string(in.message);
            QMetaObject::invokeMethod(ptrToWindowClass, "yourDefinedSlot", Qt::QueuedConnection, Q_ARG(QString, string));
        }
    }
    return 0;
}

这样的调用将在主线程中处理你的插槽,所以一切都会安全地完成

于 2012-05-18T10:06:40.380 回答