我正在使用sigslot库来触发函数中的信号。该函数使用QtConcurrent :: run在一个线程中运行,并且信号在主线程中连接。 除了信号连接每次都不工作(假设大约有25%的故障),它的工作方式与预期相当。跨线程的sigslot信号
这种不稳定的行为是有问题的,我找不到解决方案。取决于多线程上下文,sigslot库中的信号具有不同的选项,但它们中没有一个正在解决该问题。
之前努力提振,我真的想找到一个解决方案使用sigslot,因为它是一个很简单的图书馆,我只需要在这部分代码基本使用的信号和槽保持。我不希望为此使用Qt,因为我宁愿将代码的相同部分留给Qt。
任何提示将不胜感激。
更新:由于某种原因,使用作为绝望尝试sigslot :: single_threaded似乎让路更好的结果。
signal1<int, single_threaded> Sig1;
我不是说它解决了问题,因为它对我没有意义。如文档中所述: 单线程在单线程模式下,库不会尝试跨线程保护其内部数据结构 。因此,所有对构造函数,析构函数和信号 的调用都必须存在于单个线程中。
更新2:
这里是一个MWE。但结果是相当随机的。有时它完全有效,有时候不是全部。我知道这听起来很奇怪,但这就是问题所在。我也尝试了boost :: signals2而不是sigslot,但结果是完全相同的。有一个在升压:: signals2一个可执行坏访问::互斥锁::()
class A {
public :
A() {}
~A() {}
sigslot::signal1<int, sigslot::multi_threaded_local> sigslot_signal;
boost::signals2::signal<void (int)> boost_signal;
void func_sigslot() {
for (int i=0;i<4;i++) {
sigslot_signal.emit_signal(i);
}
}
void func_boost() {
for (int i=0;i<4;i++) {
boost_signal(i);
}
}
};
class B : public sigslot::has_slots<sigslot::multi_threaded_local> {
public :
B() {}
~B() {}
void test(int i) {
std::cout << "signal triggered, i=" << i << std::endl;
}
};
void main() {
A a;
B b;
a.sigslot_signal.connect_slot(&b, &B::test);
a.boost_signal.connect(boost::bind(&B::test, &b, _1));
QtConcurrent::run(&a, &A::func_sigslot);//->crashes when signal emitted
QtConcurrent::run(&a, &A::func_boost);//->crashes when signal emitted
boost::thread t1(boost::bind(&A::func, &a));
t1.join();//works fine
}
对于没有制作MWE感到抱歉,我的确在寻找全局答案而不是代码调试(就像“Qt和sigslot不会一起工作”)。由于行为不稳定,上下文相当纠结,我认为这不值得做一个例子 – brahmin
最重要的缺失部分是:没有“the”sigslot库。这是一个废弃的项目,有多个呃分解各种来源的阶段。请添加您正在使用的版本的链接。 –
那么我不知道这个关于这个库的。我开始使用,因为我发现只有很好的反馈。我正在使用这个版本:https://sourceforge.net/p/sigslot/patches/3/ – brahmin