C++ 两个不同的插槽调用相同的方法-线程安全
我对编程比较陌生,尤其是Qt。我正在编写一个应用程序,它使用两个不同的线程(secThread和minThread)计算分钟和秒数。当分钟/秒应该增加时,两个线程都会向gui发送一个信号 信号和插槽在gui类中的连接方式如下:C++ 两个不同的插槽调用相同的方法-线程安全,c++,multithreading,qt,C++,Multithreading,Qt,我对编程比较陌生,尤其是Qt。我正在编写一个应用程序,它使用两个不同的线程(secThread和minThread)计算分钟和秒数。当分钟/秒应该增加时,两个线程都会向gui发送一个信号 信号和插槽在gui类中的连接方式如下: connect(secThread, SIGNAL(increment()), this, SLOT(incrementSeconds())); connect(minThread, SIGNAL(increment()), this, SLOT(incrementMin
connect(secThread, SIGNAL(increment()), this, SLOT(incrementSeconds()));
connect(minThread, SIGNAL(increment()), this, SLOT(incrementMinutes()));
void ClockGUI::incrementMinutes(){
minutes++;
if(minutes==60) minutes=0;
updateDisplay();
}
void ClockGUI::incrementSeconds(){
seconds++;
if(seconds==60) seconds=0;
updateDisplay();
}
插槽的实现方式如下:
connect(secThread, SIGNAL(increment()), this, SLOT(incrementSeconds()));
connect(minThread, SIGNAL(increment()), this, SLOT(incrementMinutes()));
void ClockGUI::incrementMinutes(){
minutes++;
if(minutes==60) minutes=0;
updateDisplay();
}
void ClockGUI::incrementSeconds(){
seconds++;
if(seconds==60) seconds=0;
updateDisplay();
}
如您所见,两个插槽都调用私有updateDisplay()方法:
据我所知,从不同线程调用同一个插槽是线程安全的,但我的问题是:从两个不同的插槽中调用相同的方法是否线程安全?该插槽将在您的ClockGUI线程中执行,因此,这两个功能永远不会同时执行您在将信号连接到接收器插槽(此为ClockGUI*)时,按照文档使用默认的
Qt::AutoConnection
参见it的定义:
Qt::自动连接0(默认值)如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型在发出信号时确定
Qt::DirectConnection 1在发出信号时立即调用插槽。插槽在信令线程中执行
QueuedConnection 2当控件返回到接收方线程的事件循环时,将调用该插槽。插槽在接收器的线程中执行
这意味着,接收方线程将按照线程中的(按时间顺序)发射顺序,按照Qt::QueuedConnection
执行这些插槽函数,但顺序在您的情况下可能并不重要。也就是说,无论哪个线程更早到达信号发射
在这方面,Qt事件循环基本上基于FIFO(先进先出)
除此之外,我不确定您在这里所说的线程安全是什么意思。在这个场景中,您所说的线程安全是什么意思?而且,用例也不太清楚。为什么要使用线程来测量时间?既然updateDisplay()方法同时更新秒和分钟的显示,我想知道理论上这两个线程是否可以同时修改这些属性,因为有两个不同的插槽调用此方法。(是的,我同意使用线程来测量时间是过分的,但这是一个学校作业,需要使用线程)谢谢你的回答。所以,所有插槽都有一个队列,而不是每个插槽一个队列?是的,每个插槽的查询有什么意义?那将不再是一个队列,是吗?:)