【问题标题】:how to create a detached thread with QThread, like in std::thread如何使用 QThread 创建一个分离的线程,就像在 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。

标签: c++ multithreading qt qthread


【解决方案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(),它就可以工作了。
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多