我正在写一个聊天客户端,我想在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));
答案 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;
}
此类调用将在主线程中处理您的插槽,因此一切都将安全完成