从DWORD线程在MainWindow中显示QString

时间:2012-05-16 20:22:30

标签: c++ multithreading qt qt4 network-programming

我正在写一个聊天客户端,我想在MainWindow中显示消息,如displayTextEdit-> append(string);但我正在使用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;
}

线程在MainWindow中创建:

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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;
}

此类调用将在主线程中处理您的插槽,因此一切都将安全完成