用QT是怎么编写后台线程,我开启了一个耗时的线程,结果界面就卡住,只有等到这个线程执行完才会做其他。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用QT是怎么编写后台线程,我开启了一个耗时的线程,结果界面就卡住,只有等到这个线程执行完才会做其他。相关的知识,希望对你有一定的参考价值。
用QT是怎么编写后台线程的啊,我开启了一个耗时的线程,结果界面就卡住了,只有等到这个线程执行完了,才能移动鼠标等操作。怎么写一个线程做一些数据处理,而不会影响界面的其他操作呢?谢谢!
参考技术A 主界面线程不要做耗时操作比如 for() while() 放到子线程中去做,让子线程给主线程发信号或postEvent。我只是不明白 Qt 中的线程
【中文标题】我只是不明白 Qt 中的线程【英文标题】:I just don't understand threads in Qt 【发布时间】:2013-03-07 20:41:36 【问题描述】:好的,所以,这就是交易。
我目前正在使用 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();
主窗口.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);
我错过了什么?
(PS:我知道代码可能违反了大约十万个代码约定,但截止日期很快,我不得不求助于杂项。不过,这只是一个学校项目。
【问题讨论】:
您是否将MainWindow::message_received
声明为插槽?
是的,它在头文件的private slots:
部分中。
【参考方案1】:
您的代码中有逻辑错误。您将 void IPCEventListener::run() 视为处于循环中并再次执行 ang 再次 ang 的方法,但事实并非如此。 QThread::run() 是您只初始化线程并执行 exec() 函数以启动事件循环的方法。这意味着在您的应用程序的当前版本中,您尝试只接收一次消息,然后您的线程只是等待一些事件,而不对它们做任何事情。
因此,您需要一个无限循环,您将在其中尝试接收消息。并且不要忘记在程序关闭时停止这个循环。
【讨论】:
以上是关于用QT是怎么编写后台线程,我开启了一个耗时的线程,结果界面就卡住,只有等到这个线程执行完才会做其他。的主要内容,如果未能解决你的问题,请参考以下文章