我目前正在尝试了解新的QT5信号/插槽语法
connect(sender, &Sender::valueChanged, [=](const QString &newValue) {
receiver->updateValue("senderValue", newValue);
});
Run Code Online (Sandbox Code Playgroud)
现在我的问题是上面表达式中接收器SLOT的地址在哪里?我想知道这一点,因为如果信号在threadA中并且插槽位于线程B中并且我希望它是一个排队连接会发生什么?
一个插槽是一段代码,它不会在线程中"活动" - 一个线程可能会运行它,但代码本身不属于任何线程.(如果插槽是成员函数,那么定义为接收器的Qt对象属于Qt线程 - 这是对象的属性,而不是函数.)
在上面的代码中,编译器生成一个对象:
receiver按值捕获([=])该对象connect与其他两个参数一起传递.它不是QObject,所以它没有Qt意义上的拥有线程.您需要确保的是:
receiver只要该信号连接,什么指向保持活着receiver->updateValue(...)是线程安全的 - 它将在sender上下文/线程中调用.如果receiver->updateValue需要在receiver线程/上下文中调用,则不要使用该语法进行connect调用,使用指定发送方和接收方的方法以及连接类型.
| 归档时间: |
|
| 查看次数: |
1054 次 |
| 最近记录: |