- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对应用程序中的每个“长”操作都使用 QtConcurrent API。它工作得很好,但我在创建 QObjects 时遇到了一些问题。
考虑这段代码,它使用一个线程来创建一个“Foo”对象:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
return result;
});
它运行良好,但如果“Foo”类派生自 QObject 类,则“结果”实例属于创建该对象的 QThread。
所以要正确使用“结果”实例的信号/槽,应该做这样的事情:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
// Move "result" to the main application thread
result->moveToThread(qApp->thread());
return result;
});
现在,一切都按预期工作,我认为这是正常行为和名义解决方案。
我有很多这种代码,有时创建对象,也可以创建对象。它们中的大多数都是通过“moveToThread”调用正确创建的。
但有时,我会错过一个“moveToThread”调用。
然后,很多事情看起来都不起作用(因为这个对象槽“坏了”),没有任何 Qt 警告。
现在,我有时会花很多时间来弄清楚为什么有些东西不起作用,然后才明白这只是因为不再在特定对象实例上调用插槽。
有什么办法可以帮助我预防/检测/调试这种情况吗?例如:
谢谢
最佳答案
跟踪对象在线程间的移动是可能的。就在一个对象被移动到新线程之前,它被发送一个 ThreadChange
事件。您可以过滤该事件并让您的代码运行以记录对象何时离开线程。但现在要知道该物体是否去了任何地方还为时过早。要检测到这一点,您需要将元调用(请参阅 this question)发布到对象的队列中,以便在对象的事件处理在新线程中恢复时立即执行。您还可以附加到 QThread::finished
以有机会查看您的对象列表并检查它们是否存在于即将结束的线程上。
但这一切都相当复杂:每个线程都需要自己的跟踪器/过滤器对象,因为事件过滤器必须存在于对象的线程中。我们可能需要 200 多行代码才能正确处理所有极端情况。
相反,您可以利用 RAII 并使用将线程关联作为资源管理的句柄来保存对象(因为它是一个资源!):
// https://github.com/KubaO/stackoverflown/tree/master/questions/thread-track-38611886
#include <QtConcurrent>
template <typename T>
class MainResult {
Q_DISABLE_COPY(MainResult)
T * m_obj;
public:
template<typename... Args>
MainResult(Args&&... args) : m_obj{ new T(std::forward<Args>(args)...) } {}
MainResult(T * obj) : m_obj{obj} {}
T* operator->() const { return m_obj; }
operator T*() const { return m_obj; }
T* operator()() const { return m_obj; }
~MainResult() { m_obj->moveToThread(qApp->thread()); }
};
struct Foo : QObject { Foo(int) {} };
您可以按值返回一个MainResult
,但必须显式指定仿函数的返回类型:
QFuture<Foo*> test1() {
return QtConcurrent::run([=]()->Foo*{ // explicit return type
MainResult<Foo> obj{1};
obj->setObjectName("Hello");
return obj; // return by value
});
}
或者,您可以返回调用 MainResult
的结果;它本身是一个仿函数,可以节省一些输入,但这可能被认为是一种 hack,也许您应该将 operator()()
转换为具有短名称的方法。
QFuture<Foo*> test2() {
return QtConcurrent::run([=](){ // deduced return type
MainResult<Foo> obj{1};
obj->setObjectName("Hello");
return obj(); // return by call
});
}
虽然最好将对象与句柄一起构造,但也可以将实例指针传递给句柄的构造函数:
MainResult<Foo> obj{ new Foo{1} };
关于c++ - 有什么方法可以检测 QObject 是否属于 "dead"QThread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611886/
这是一个简单的问题,但它一直困扰着我和我的日志。 我有一个配置: akka { log-dead-letters-during-shutdown = off log-dead-letters
这是 my question here 的一种扩展. 我有 3 个类(class)。 我的主要内容: import java.io.*; public class ConnectionManager
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我知道在Java中的垃圾收集期间,不再有任何引用的对象会被标记为“死亡”,以便垃圾收集器可以将它们从内存中删除。 我的问题是,在垃圾收集阶段,所有“死亡”对象是否都会从内存中删除,或者其中一些对象会存
在那里, 我修改了 Lua 5.0 在线文档中的“perm”示例:http://www.lua.org/pil/9.3.html .我所做的是将 __call() 元方法重新指向 perm() 函数。
我正在开发一个 JavaEE 应用程序,我有以下方法: public String alterar_data_ato_med (int cod_ato, GregorianCalendar nova_
if (myCondition1 && myCondition2 && myCondition3) { ... } 我写了这段代码并运行成功。但我收到了关于 (...) 的一部
“死牛肉”一词是什么意思?我是从一个面试问题中读到的。它与ipv6有关。我以为它可能是一个随机的十六进制数字,例如“快速的棕色狐狸跳过了懒狗”。 我的理解正确吗?还是更有意义? 最佳答案 http:/
“死牛肉”这个词是什么意思?我是从一个面试问题中读到的。和ipv6有关系。我认为它可能是一个随机的十六进制数字,用于示例,例如“敏捷的棕色狐狸跳过了懒狗”。 我的理解正确吗?还是有更重要的意义? 最佳
https://docs.docker.com/engine/reference/commandline/ps/说 status One of created, restarting, running
我有一些正在为类(class)编写的 VHDL 代码。但是,综合工具将 cell3、cell2 和 cell1 识别为“死”代码,并且不会对其进行综合。 我真的不知道是什么导致单元格 3、2、1 在合
自 7 月 17 日起,旧的分享按钮在我管理的所有网站上都停止工作了。 我已经阅读了其他面临类似问题的用户的报告,但我找不到任何官方信息。 您知道是否有任何官方资源可用吗? 最佳答案 更新:截至 20
public class DeadCodeInLuna { public static void main(String[] args) throws IOException {
我有许多 UIView 进入 View ,然后离开 View 并且未被使用。但是,我相信他们中的一些人即使在他们离开后仍会收到通知,这会导致问题。 在 UIView“父”容器上: if(self._c
我正在尝试查找未被任何其他代码调用的私有(private)方法 (CA1811) https://msdn.microsoft.com/en-us/library/ms182264(v=vs.110)
对于那些不确定“受约束的非确定性”是什么意思的人,我推荐 Mark Seeman 的 post . 这个想法的本质是只对影响 SUT 行为的数据具有确定性值的测试。不“相关”的数据在某种程度上可以是“
首先,澄清一下,我不是在谈论解除对无效指针的引用! 考虑以下两个示例。 示例 1 typedef struct { int *p; } T; T a = { malloc(sizeof(int) };
我在我们的代码库中遇到了这个代码片段: function initDoughnutChart(target) { var labels = $(target).data("labels").toS
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在使用一个继承的代码库,其中包含数千行注释掉的代码。我知道以前的编码员打算为后代保存他所有的辛勤工作,而不是简单地将其删除,但是:我永远不会阅读它,它只会妨碍您。一个问题示例是,当我对某些代码段执
我是一名优秀的程序员,十分优秀!