我正在学习Qt,有一个非常基础的问题。
如果在一个槽函数中存在(函数作用域)变量,并且该槽函数被多次调用,在上一次调用返回之前每次调用都会覆盖变量吗?也就是说,如果在上一次运行返回之前调用槽函数,那么这不会导致错误吗?
谢谢。
如果这些调用是从不同的线程发起的并且您正在使用直接连接,则是可以的。
如果您使用了排队连接,那么槽函数调用将在事件循环上依次执行,该事件循环在您的接收对象所属的线程上运行。(感谢Idan K评论的编辑)。
请查看Signal and slots的排队连接或QMutexLocker来解决您的问题。
class WheelSpinner : public QThread
{
Q_OBJECT;
public:
WheelSpinner( QObject* receiver, const char* slot )
{
connect( this, SIGNAL( valueChanged( int ) ), receiver, slot,
Qt::DirectConnect );
}
void run()
{
for ( int i = 0; i < 100000; ++i )
{
emit ( valueChanged( i ) );
}
}
public signals:
void valueChanged( int value );
};
class ProgressTracker : public QObject
{
Q_OBJECT;
public:
ProgressTracker() { }
public slots:
void updateProgress( int value )
{
// While in this function, "value" will always be the proper
// value corresponding to the signal that was emitted.
if ( value == 100000 )
{
// This will cause us to quit when the *first thread* that
// emits valueChanged with the value of 100000 gets to this point.
// Of course, other threads may get to this point also before the
// program manages to quit.
QApplication::quit();
}
}
};
int main( int argc, char **argv )
{
QApplication app( argc, argv );
ProgressTracker tracker;
WheelSpinner spinner1( &tracker, SLOT( updateProgress( int ) ) );
WheelSpinner spinner2( &tracker, SLOT( updateProgress( int ) ) );
WheelSpinner spinner3( &tracker, SLOT( updateProgress( int ) ) );
spinner1.run();
spinner2.run();
spinner3.run();
return ( app.exec() );
}