我有一個下載種子檔案的功能。我需要在與 GUI 執行緒不同的執行緒中下載 torrent,因此我使用 QtConcurrent::run 在另一個執行緒中開始下載,但我在一個對話框中開始下載,并且在下載開始后對話框立即關閉,并且(我是 qt 的新手,所以我認為)關閉對話框,對話框物件被洗掉,并且對話框 QFuture 和 QFutureWatcher 也被洗掉,并且由于 QFutureWatcher 不再存在,它不會發出完成的信號。有人可以告訴我如何解決這個問題,如果我上面寫的是真的嗎?
這是我用來開始下載的代碼:
主視窗.cpp
void MainWindow::on_downloadButton_clicked {
DownloadDialog ddl_dial;
ddl_dial.exec();
}
下載diaolg.cpp
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();
}
uj5u.com熱心網友回復:
Dialog 被洗掉是因為它超出了范圍,因為它是在堆疊上實體化的。使用堆。
DownloadDialog* ddl_dial = new DownloadDialog(this);
ddl_dial->exec();
不要忘記在某些時候洗掉它以避免記憶體泄漏。
uj5u.com熱心網友回復:
GUI 在 QT 中有一個執行緒。請看這個
如前所述,每個程式在啟動時都有一個執行緒。該執行緒稱為“主執行緒”(在 Qt 應用程式中也稱為“GUI 執行緒”)。Qt GUI 必須在這個執行緒中運行。所有小部件和 幾個相關的類,例如 QPixmap,都不能在輔助執行緒中作業。輔助執行緒通常被稱為“作業執行緒”,因為它用于從主執行緒卸載處理作業。
但是你可以有一個單獨的下載類,然后從QThread繼承它。
您可以通過使用將它們移動到執行緒來使用作業物件QObject::moveToThread()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463646.html
