gpt4 book ai didi

c++ - Qt:信号主线程

转载 作者:行者123 更新时间:2023-11-30 02:29:55 25 4
gpt4 key购买 nike

存在很多类似的问题,但没有找到合适的答案。

我使用第 3 方库。

当调用 lib 类上的某些虚拟方法时,这些是从我的应用程序启动的工作线程调用的。这个线程不是 QThread,也不可能是。

我可以从此线程发出信号,但前提是我使用 Qt::DirectConnection 连接插槽。结果是 SLOT 中的 QObject::sender() 将始终返回 NULL。例如,我希望调用 deleteLater(),但这只能在 QThread 中安排。

我想我需要回到主线程,但我怎样才能在主线程上向对象发出信号?

示例:调用以下方法时,它是在第 3 方库创建的线程上完成的。

/*virtual*/ bool MediaPlayer::onEof()
{
stopTransmit();
emit sigFinished(); // slots only called if bound using Qt::DirectConnection
deleteLater(); // dtor is never called

return false;
}

连接也是从非 QThread 上下文中建立的,如下所示:

/*virtual*/ void
SipCall::state_answer_call::onEntering(SipCall& ref)
{
...
MediaPlayer* player = new MediaPlayer;
ref.connect(player, SIGNAL(sigFinished()), SLOT(slotMediaFinished()), Qt::DirectConnection);
...
}

如果没有显式的 Qt::DirectConnectionSipCall::slotMediaFinished() 永远不会被调用。

最佳答案

问题是您的 MediaPlayer 实例 player 是在没有事件事件循环的线程上创建的。

当您将代码更改为...

ref.connect(player, SIGNAL(sigFinished()), SLOT(slotMediaFinished()), Qt::QueuedConnection);

Qt 基础结构将向与播放器 关联的线程发布一个事件。由于没有事件循环来处理该事件,因此永远不会调用目标代码 MediaPlayer::slotMediaFinished

所以问题是...您希望在哪个线程上调用 MediaPlayer::slotMediaFinished?如果它是您可以尝试的主应用程序线程(假设您使用的是 qt5 和 c++11)...

ref.connect(player, &MediaPlayer::sigFinished, QCoreApplication::instance(),
[&]()
{
player->slotMediaFinished();
},
Qt::QueuedConnection);

这将使用与 QCoreApplication 实例关联的 QThread 作为 context在其中执行 lambda。

编辑:

正如您所说,您不能使用 qt5 或 c++11,我可以建议的唯一其他选择是在您的主应用程序线程上有一个 QObject 派生变量,它可以充当player...

的代理上下文
class proxy: public QObject {
Q_OBJECT;
public slots:
void slotMediaFinished ()
{
if (MediaPlayer *player = dynamic_cast<MediaPlayer *>(sender()) {
player->slotMediaFinished();
}
}
};

在您的应用程序线程上创建上述实例,然后您的 connect 语句将是...

ref.connect(player, SIGNAL(sigFinished()), &proxy_instance, SLOT(slotMediaFinished()), Qt::QueuedConnection)

proxy_instance 是,呃,proxy 实例。现在,当发出 sigFinished 信号时,Qt 会将事件发布到 proxy_instance。这反过来将调用 proxy::slotMediaFinished,它可以从 QObject::sender 中识别感兴趣的 MediaPlayer 实例并调用其 slotMediaFinished 成员。

关于c++ - Qt:信号主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39224068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com