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);
}