该项目分为两部分,一个完成所有处理的库和GUI。该库完全使用C ++ / MFC,不应该进行太多更改,因为它也用于必须在没有Qt依赖性的情况下运行的任何Qt项目中。
该库定义了一个用于调用GUI的接口。所以Qt GUI也实现了这个接口,以便接收来自库的调用。该库运行多个线程。 GUI调用的某些处理不应阻止库运行。因此GUI类定义了槽和信号,信号在实现的接口函数中发出。信号和插槽使用以下连接:
connect(this, SIGNAL(xyz), this SLOT(xyz));
我认为问题在于发出信号的接口函数正在thread A
中运行,但GUI在thread B
中运行。正确的方法是在库中创建QObject并在那一侧定义信号,但在我的情况下这是不可能的。有什么建议吗?
答案 0 :(得分:1)
在您的界面功能中,而不是发出信号,请使用QMetaObject::invokeMethod()
或QTimer::singleShot()
。
对于QMetaObject::invokeMethod()
,您可能需要明确传递Qt::QueuedConnection
。
对于QTimer::singleShot()
,设置延迟为0 ms。
另外技术上connect(this, SIGNAL(xyz), this, SLOT(xyz),Qt::QueuedConnection);
然后调用信号你的接口函数将起作用。但我并不是从课外发出信号的忠实粉丝。这在Qt 4中是不可能的,因为信号是受保护的功能,自Qt 5以来这已经改变,因为公共信号是新连接语法的必要条件。