如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样
Posted
技术标签:
【中文标题】如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样【英文标题】:how to create a detached thread with QThread, like in std::thread 【发布时间】:2021-12-03 23:30:54 【问题描述】:我已经使用 QThread 在 QT 中创建了一个线程,但线程的父级在线程完成之前退出,它本身正在无限运行。
//mainwindow.cpp
void MainWindow::showEvent(QShowEvent *ev)
QMainWindow::showEvent(ev);
showEventHelper();
void MainWindow::showEventHelper()
//back-end thread
ServerStart *serverstart = new ServerStart();//initializing a pointer to my class
QThread thread;
serverstart->moveToThread(&thread);
QObject::connect(&thread, &QThread::started, serverstart, &ServerStart::run);
thread.start();
//in std::thread i used to detache it like so:
//std::thread worker(serverMain);
//worker.detach();
重要提示:我正在制作一个 GUI 项目。并且我的无限线程位于 onShow() 方法中,该方法需要退出才能使应用程序继续并制作 UI。并且我还想将来从线程向主线程发送信号,并且主线程应该能够根据信号响应和修改UI。
如何在 QT 中做同样的事情?
【问题讨论】:
分离一个线程并不是一个普通的操作,也许你可以只new
一个QThread,传递一个QObject
来管理线程的生命周期?
哦,我想,我的帖子不清楚。我正在制作一个 GUI 项目。并且我的无限线程位于 onShow() 方法中,该方法需要退出才能使应用程序继续并制作 UI。并且我还想将来从线程向主线程发送信号,主线程应该能够根据信号响应和修改UI。
【参考方案1】:
您不能,但是根据正确使用 QThread
的 KDAB 文档,您可以通过将 QThread::finished
连接到 QThead::deleteLater
来模拟这种行为,如他们的 QThread
文档所示 https://www.kdab.com/wp-content/uploads/stories/multithreading-with-qt-1.pdf
【讨论】:
我不希望主线程退出。我编辑了我的帖子,因为我在抱歉之前没有包含它。 也许您需要QThread
为您的任务设置事件循环,请参阅KDAB 文档,了解如何将QThread
作为事件循环启动。
问题解决了,我只将线程初始化移动到int main()
,它就可以工作了。以上是关于如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样的主要内容,如果未能解决你的问题,请参考以下文章