Qt信号槽连接方式的区别

1

Qt::AutoConnection

根据signal和slot所处的线程自动决定。

如果sender线程和receiver在同一个线程。那么这个执行是同步的。相当于DirectConnection

如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接。

如果判断信号和槽所在的线程呢?根据sender和receiver是哪个线程创建的,哪个线程创建就属于哪个线程,

也可以通过QObject :: moveToThread去改变所属的线程

qt多线程的应用中使用QObject :: moveToThread就是应用这一特性

2

Qt::DirectConnection

是直接连接。相当于直接调用slot函数。

sender_thread

{

   emit signal()

}

等同于


sender_thread

{

   call slot()

}

slot函数一定是在sender线程的上下文执行。

这种情况一定可以直接传递栈内的地址和new(可能被发送者删除)的数据。没有问题

3

Qt::QueuedConnection

一定是在receiver的线程上下文执行

这种情况一定 不 可以直接传递栈内的地址和new(可能被发送者删除)的数据

线程A

sender_thread

{

  emti signal(argument)  = some_queue.push(argument)立刻返回。

}

线程B

receiver_thread 

{

  argument=some_queue.pop();

  slot(argument);

}

4

Qt::BlockingQueuedConnection

一定可以直接传递栈的参数和new的变量。即使new的会在emit以后立刻删除

等同于

线程A

send_thread

{

   emit signal= some_queue.push(argument,some_event)

   waitEvent(some_event,INFINITE)

   continue

}

线程B

receiver_thread

{

   argument=some_queue.pop()

   call slot(argument);

   setEvent(event);

}

发布了45 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/102932516
今日推荐