- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不能共享代码,但是下面有一个例子。这是我的问题。想象一下,我有一个具有QThreadPool实例的 Controller 类。此类保留一个工作对象列表。启动可运行对象时,我将创建一个工作程序并将其提供给可运行对象。可运行对象在不同的线程上操作每个工作程序。当可运行项完成后,它将向 Controller 对象发出一个信号。然后, Controller 对象从工作程序中读取结果并删除工作程序。 Controller 保留所有工作程序的列表,以便可以在工作程序上设置cancel标志,以便线程可以在必要时提早退出。
问题是QThreadPool在销毁时将等待所有线程完成,这些线程将在 Controller 析构函数中。由于信号是从线程中触发时排队的,因此潜在地取消 Controller 析构函数中的工作程序将使信号排队以传递到 Controller 。但是由于 Controller 将位于析构函数的上下文中,因此这些信号不会到达 Controller 插槽,因此不会破坏工作对象。
也许我没有按照应有的方式处理线程池。如果我销毁了可运行对象中的worker对象,则有可能在另一个线程试图取消一个worker之前销毁该worker。任何人都可以推荐一种创建可取消线程池的好方法吗?
class Controller : public QObject {
Q_OBJECT
public:
virtual ~Controller();
QThreadPool pool;
void startTask();
Q_SLOT void onWorkerDone(Worker * worker);
QList<Worker*> workers;
void cancelAll();
}
void Controller::startTask() {
Worker * worker = new Worker();
connect(pool, SIGNAL(done(Worker *)), this, SLOT(onWorkerDone(Worker *));
workers << worker;
pool.start(new Runnable(worker);
}
void Controller::onWorkerDone(Worker * worker) {
if ( worker ) {
// read worker...
delete worker;
}
}
Controller::~Controller() {
cancelAll();
// Destructor now kills pool object.
// The pool will wait until all threads complete.
// If there are any workers still running on the
// other threads, their done() signals will be
// queued to this instance, and since we're in
// the dtor, they won't make it to the slot,
// and worker won't get deleted.
}
void Controller::cancelAll() {
// loop the list and call cancel.
}
最佳答案
简单的解决方案是将QThreadPool
子类化,并向该类添加aboutToWait
信号。该信号将需要在析构函数中发出。然后,您可以将信号连接到 Controller 的cancelAll()
插槽。
为此,必须在工作人员列表之后声明该池!
假设您破坏了 Controller (this
)。发生以下情况:
this.~Controller
的正文。Controller
的实例。现在必须将其分解为基类的实例。成员将按照相反的声明顺序销毁。threadPool
首先被销毁。 threadPool.~MyThreadPool
发出aboutToWait
。this.cancelAll
运行,因为它是直接连接的。该调用源自moc生成的signal方法的实现。它让 worker 知道他们应该停下来。threadPool.~MyThreadPool
运行,并且成员(如果有的话)以相反的声明顺序销毁。 this
现在是QThreadPool
的实例。threadPool.~QThreadPool
运行并等待工作人员停止。随着每个工作程序停止,controller.onWorkerDone
被调用,因为它直接连接到相关线程池的信号。最终,threadPool.~QObject
运行的池被完全破坏了。workers.~QList
运行。this.~QObject
运行。关于multithreading - 如何使用QThreadPool取消线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548957/
是否可以使用标准输入/标准输出在 bash 中压缩/解压缩字符串? 我试过了,但显然不支持它? hey=$(echo "hello world" | gzip -cf) echo $hey # ret
我的任务是让一个企业网站适用于 IE7,它必须“足够好”,因此我禁用了任何导致问题的花哨/非必要功能。 其中之一是正在使用的搜索栏,需要进行哪些搜索,我猜测幕后某个地方有某种 JavaScript 用
我有一个执行大量处理的小程序。您可以通过按回车键打印进度。 我实现它的方法是在主线程中完成处理,同时我有一个 pthread 不断循环 getchar() 以等待输入键。 问题是当我完成处理时。发生这
我完全理解 suspendCoroutine 与 suspendCancellableCoroutine 在我的示例中的工作方式。但我想知道为什么 println("I finished") (第 1
我是 QT 的新手。目前在我的项目中我实现了 QFileDialog . 在我的用例中:每当用户选择一个文本文件时,它都会执行 functionA .但是,我发现如果在文件对话框中单击取消,funct
我有代码,仅在用户选择“另存为”时运行。为此并获取我正在使用的文件的新名称 Application.GetSaveAsFilename功能。 我遇到的问题是类型不匹配,同时检查用户是否在他没有这样做时
我的 UILocalNotification 有问题。 我正在用我的方法安排通知。 - (void) sendNewNoteLocalReminder:(NSDate *)date alrt:(NS
祝你有美好的一天 我有一个网站,其中有很多“工具提示”。这些工具提示是在将鼠标悬停在文本的特定部分上时创建的。工具提示是一个 div block ,它显示在网站上所有其他内容的顶部,并且当光标从文本移
我遇到以下问题。每隔 2 秒,程序就会进入 if 语句。在这个 if 语句中,我想要一个计时器,它会在 15 秒后给我一条消息。计时器应延迟 1 秒运行。但是当我用计时器“等待”时,if 语句将再执行
基本上我有以下代码片段, (let [task (FutureTask. fn) thr (Thread. task)] (.start thr) ;;wait for signa
取消正在进行的 ASIHttpRequest 请求的正确位置在哪里?这就是我取消的方式,但是当我 时它继续崩溃在不让请求完成的情况下从一个 View Controller 转移到另一个 View Co
我在我的 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务(执行数据库操作)。由于所有工作都是在另一个类中完成的,因此取消并不那么简单。我在另
我正在使用 OneSignal 向我的用户显示通知。通知工作正常,但我注意到,如果我在通知栏中“滑动”取消通知,则通知将永远保留,这是一张显示应用程序图标上的通知的图像,我想在应用程序已打开: 我看到
正在运行的 AsyncTask 的 .cancel(boolean) 方法如何工作?这是文档: Attempts to cancel execution of this task. This atte
我注意到,当我激活约束时,我会立即在该行代码处收到一条警告,指出不能同时满足约束。 我假设布局是在“UI 更新周期”之类的稍后时间点计算的,而不是每次约束都被(取消)激活。因此,在(取消)激活约束的代
这是我创建线程的方式: readFromWebThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadThread:
我目前正在尝试取消与我的数据模型中的对象关联的特定 UILocalNotifications。为此,每个数据对象都有一个唯一标识符,即 NSUUID。 创建 UILocalNotification:
当我提交并单击“确定”时,它会继续,但当我按“取消”时,它仍然会提交。我尝试使用此代码,但提交和取消按钮仍然执行相同的操作。 model.saveForm = function() { var
我有一个警报弹出窗口,当发生特定操作时会出现该弹出窗口。 5 秒后,使用 setTimeout() 隐藏警报弹出窗口。 我遇到的问题是,如果我多次触发弹出窗口,有时后续的弹出窗口会出现但立即消失。我相
我有一些 javascipt (jQuery),其中单击按钮时会淡入 #myDiv,然后使用超时函数在 5 秒后再次淡出。它工作正常,但如果用户在超时内的 fadeOut 函数运行之前再次单击该按钮,
我是一名优秀的程序员,十分优秀!