公司动态
Qt信号槽连接方式 BlockingQueuedConnection:能同步等待,但别轻易碰
Qt BlockingQueuedConnection:能同步等待,但别轻易碰Qt::BlockingQueuedConnection是一种会让发送线程停下来等待的队列连接。connect(sender, Sender::request, receiver, Receiver::handleRequest, Qt::BlockingQueuedConnection);信号发出后,Qt 把槽调用投递到接收者线程的事件队列。和普通QueuedConnection不同,发送线程不会继续往下走,而是一直等到接收者的槽函数执行并返回。这听起来很像“跨线程同步调用”,没错,它就是。但也正因为这样,它是四种连接里最需要谨慎的一种。先看它解决什么问题假设一个工作线程需要让主线程执行一段只能在主线程运行的代码,并且工作线程必须等到这段代码结束才能继续。connect(worker, Worker::requestUserDecision, window, MainWindow::askUserDecision, Qt::BlockingQueuedConnection);工作线程发出requestUserDecision后会挂起;主线程从队列中取出请求,执行askUserDecision();槽函数返回后,工作线程解除等待。这里的“必须等”要是真的必须。只是想拿到某个结果、或者想保证更新顺序,并不自动意味着应该阻塞一个线程。很多时候,发一个结果信号回来会更清晰,也不会把线程卡在原地。同一线程一