C++ 从DWORD线程在主窗口中显示QString

C++ 从DWORD线程在主窗口中显示QString,c++,multithreading,qt,qt4,network-programming,C++,Multithreading,Qt,Qt4,Network Programming,我正在编写一个聊天客户端,我想在主窗口中显示消息,比如displayTextEdit->appendstring;但我用的是DWORD线程 怎么做?我不知道,如何连接这个线程与主窗口,有什么想法吗 DWORD WINAPI RECV_MESSAGE(int &s) //&s is a socket, from winsock2 { gg_header header; // incoming packet type gg_recv_msg in; // tex

我正在编写一个聊天客户端,我想在主窗口中显示消息,比如displayTextEdit->appendstring;但我用的是DWORD线程

怎么做?我不知道,如何连接这个线程与主窗口,有什么想法吗

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;
}
线程是在主窗口中创建的:

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

考虑创建一个QObject派生类,通信线程可以使用该类与主窗口通信

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

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

在窗口中声明将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;
}

这样的电话会处理你在主线程中的位置,所以一切都会安全地完成

我想我还不能投票,以降低声誉。。。但是解决方案不起作用,或者我做错了什么。你得到调试输出了吗?检查QMetaObject::invokeMethod返回什么哇,它工作了,是我的错,非常感谢!还有一个问题:向该线程传递指针和套接字的最佳方式是什么?CreateThread只允许我传递一个参数,我尝试按结构传递,但socket无法处理这个参数。顺便说一句:如果你确定只有一个窗口实例,你可以使用单例模式。当您将在线程之间使用它时,您必须确保在使用它之前不会破坏指向的对象。鲁兹·波尔斯基(ludzi z Polski)开玩笑地说,我是尼德·马约(nie tak mało);波兹德罗维尼亚