关于Qt插槽和多个电话的问题

时间:2009-12-31 09:54:02

标签: qt qt4

我只是在学习Qt并且有一个非常基本的问题。

如果插槽中有(函数范围)变量,并且多次调用该插槽,则每次返回最后一次调用之前(这是否可能?),每次都会覆盖该变量吗?从某种意义上说,如果在上一次运行返回之前调用了插槽,那么这不会导致错误吗?

感谢。

3 个答案:

答案 0 :(得分:2)

如果来自不同线程的呼叫并且您正在使用直接连接,则为是。

如果使用排队连接,那么将在接收对象所属的线程上运行的事件循环中一个接一个地执行插槽调用。 (编辑感谢Idan K评论)。

结帐Signal and slots的排队连接或QMutexLocker来解决您的问题。

答案 1 :(得分:1)

如果你真的使用函数范围变量,那么它应该无关紧要。例如:

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

答案 2 :(得分:1)

只要函数为reentrant,就没有问题。