首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法从对话框中启动一个新线程并在qt中的主窗口中使用它?

是否有方法从对话框中启动一个新线程并在qt中的主窗口中使用它?
EN

Stack Overflow用户
提问于 2022-04-23 15:33:31
回答 2查看 100关注 0票数 0

我有一个下载急流文件的函数。我需要在一个独立于GUI线程的线程中下载急流,所以我使用了QtConcurrent::run在另一个线程中启动下载,但是我在一个对话框中启动了下载,并且在下载开始后对话框立即关闭,并且(我对qt还不熟悉,所以我认为)关闭对话框,对话框对象被删除,对话框QFuture和QFutureWatcher也被删除,而且由于QFutureWatcher不再存在,它不会发出已完成的信号。有人能告诉我如何解决这个问题,如果我上面写的是真的吗?

下面是启动下载所用的代码:

mainwindow.cpp

代码语言:javascript
复制
void MainWindow::on_downloadButton_clicked {
  DownloadDialog ddl_dial;
  ddl_dial.exec();
}

downloaddiaolg.cpp

代码语言:javascript
复制
on_finishButton_clicked() {
  TorrentDDL tddl;
  QFutureWatcher<void> *watcher = new QFutureWatcher<void>;
  QFuture<void> tddl_thread = QtConcurrent::run(&TorrentDDL::download, 
  &tddl, magnet_str_url, file_path);
  watcher->setFuture(tddl_thread);
  close();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-24 10:58:47

对话框被删除,因为它超出了作用域,因为它是在堆栈上实例化的。使用堆。

代码语言:javascript
复制
DownloadDialog* ddl_dial = new DownloadDialog(this);
ddl_dial->exec();

不要忘记在某个时候删除它,以避免内存泄漏。

票数 1
EN

Stack Overflow用户

发布于 2022-04-23 15:57:58

GUI在QT中有一个线程。请参阅

如前所述,每个程序在启动时都有一个线程。这个线程被称为“主线程”(在Qt应用程序中也称为"GUI线程“)。 Qt必须在这个线程中运行。 All widgets几个相关的类,例如QPixmap,不能在辅助线程中工作。辅助线程通常被称为“工作线程”,因为它用于从主线程卸载处理工作。

但是您可以有一个单独的类来下载,然后从QThread继承它。

通过使用QObject::moveToThread()将工作对象移动到线程,可以使用worker对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71981096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档