0

私はチャット クライアントを作成しており、displayTextEdit->append(string); のように MainWindow にメッセージを表示したいと考えています。しかし、私は 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));
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 を param として取得して処理するウィンドウのスロットを宣言します。次のように 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 に答える