Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我只是不知道';我不理解Qt中的线程_C++_Qt_Ipc - Fatal编程技术网

C++ 我只是不知道';我不理解Qt中的线程

C++ 我只是不知道';我不理解Qt中的线程,c++,qt,ipc,C++,Qt,Ipc,好吧,就这样吧 我目前正在使用SysV IPC编写一个小型聊天消息模拟/项目,我的客户端应用程序使用Qt。我想要的是一个后台线程,它将在消息队列上等待,并在出现新消息时向GUI线程发送信号。我曾尝试使用QThread继承编写代码,但它似乎不起作用,没有显示消息,我想我在这里遗漏了一些东西 至于守则: ipcEventListener.h: class IPCEventListener : public QThread { Q_OBJECT public: IPCEventList

好吧,就这样吧

我目前正在使用SysV IPC编写一个小型聊天消息模拟/项目,我的客户端应用程序使用Qt。我想要的是一个后台线程,它将在消息队列上等待,并在出现新消息时向GUI线程发送信号。我曾尝试使用QThread继承编写代码,但它似乎不起作用,没有显示消息,我想我在这里遗漏了一些东西

至于守则: ipcEventListener.h:

class IPCEventListener : public QThread
{
    Q_OBJECT
public:
    IPCEventListener();
    void run();
    messageWrapper mw;
signals:
    void sendChatMsg(MSG_CHAT_MESSAGE cm);
};
ipcEventListener.cpp

IPCEventListener::IPCEventListener()
{

}
void IPCEventListener::run()
{
        mutex.lock();
        int n = msgrcv(myQueueId, &mw, sizeof(mw)-sizeof(long), 0, IPC_NOWAIT);
        mutex.unlock();
        if (n>0)
        {
            snip...
            else if (mw.resp.type == MESSAGE)
            {
                emit sendChatMsg(mw.chatMsg);
            }
        }
    exec();
}
mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    listener = new IPCEventListener(this);
    connect(this->listener, SIGNAL(sendChatMsg(MSG_CHAT_MESSAGE)), this, SLOT(message_received(MSG_CHAT_MESSAGE)));
    connect(this->ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
    listener->start();
    ui->comboBox->addItem("Client");
    ui->comboBox->addItem("Room");
}
void MainWindow::message_received(MSG_CHAT_MESSAGE cm)
{
    QString formattedMessage = "";
    formattedMessage.append("[");
    formattedMessage.append(cm.send_time);
    formattedMessage.append("] ");
    if (cm.msg_type == PRIVATE) formattedMessage.append("[PRIV:] ");
    formattedMessage.append(cm.sender);
    formattedMessage.append(": ");
    formattedMessage.append(cm.message);
    formattedMessage.append("\n");
    ui->textEdit->append(formattedMessage);
}
我错过了什么


(注:我知道该代码可能会打破大约十万个代码约定,但截止日期很快,我不得不求助于胡言乱语。不过,这只是一个学校项目)。

您的代码中有一个逻辑错误。您将void IPCEventListener::run()视为一个方法,该方法位于循环中,并且正在再次执行,但事实并非如此。QThread::run()是一种只初始化线程并执行exec()函数以启动事件循环的方法。这意味着在应用程序的当前版本中,您尝试只接收一次消息,然后您的线程只是在等待一些事件,而不做任何处理


因此,您需要的是一个inifite循环,您将尝试在其中接收消息。并且不要忘记在程序关闭时停止此循环。

您是否将
MainWindow::message\u接收的
声明为插槽?是的,它位于头文件的
专用插槽:
部分。