如何保护 QThread 函数,使其在完成之前的工作之前不会再次被调用?

Posted

技术标签:

【中文标题】如何保护 QThread 函数,使其在完成之前的工作之前不会再次被调用?【英文标题】:How can I protect a QThread function so it will not be called again until finished its previous work? 【发布时间】:2011-08-03 14:48:06 【问题描述】:

我正在使用 QThread,在它的 run 方法中,我有一个计时器调用一个函数,该函数执行一些需要一些时间的繁重操作。通常超过触发计时器的时间间隔(但并非总是如此)。

我需要保护这个方法,只有在它完成之前的工作后才能调用它。

代码如下:

NotificationThread::NotificationThread(QObject *parent)
           : QThread(parent),
             bWorking(false),
             m_timerInterval(0)





NotificationThread::~NotificationThread()

    ;


void NotificationThread::fire()

    if (!bWorking)
    
        m_mutex.lock(); // <-- This is not protection the GetUpdateTime method from invoking over and over.

        bWorking = true;

        int size = groupsMarkedForUpdate.size();
        if (MyApp::getInstance()->GetUpdateTime(batchVectorResult))            
        
            bWorking = false;
            emit UpdateNotifications();                        
                    
        m_mutex.unlock();
    



void NotificationThread::run()

    m_NotificationTimer = new QTimer();
    connect(m_NotificationTimer, 
            SIGNAL(timeout()),
            this,
            SLOT(fire(),
            Qt::DirectConnection));

    int interval = val.toInt();
    m_NotificationTimer->setInterval(3000);
    m_NotificationTimer->start();

    QThread::exec();



// This method is invoked from the main class
void NotificationThread::Execute(const QStringList batchReqList)

    m_batchReqList = batchReqList;
    start();

【问题讨论】:

您需要重新格式化您的问题。不清楚。 不要继承 QThread。 labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong 这是遗留代码,我不能不继承它 【参考方案1】:

您可能总是有一个线程需要运行连接到一个 onDone 信号的方法,该信号会提醒所有订阅者它已完成。那么你不应该遇到与双重锁检查和内存重新排序相关的问题。在每个线程中保持运行状态。

【讨论】:

【参考方案2】:

我假设您想保护您的线程免受来自另一个线程的调用。我对吗?如果是,那么..

这就是 QMutex 的用途。 QMutex 为您提供了一个接口来“锁定”线程,直到它“解锁”,从而序列化对线程的访问。您可以选择解锁线程,直到它完成工作。但使用它需要您自担风险。如果使用不当,QMutex 会出现其自身的问题。有关这方面的更多信息,请参阅文档。

但是还有很多方法可以解决您的问题,例如,@Beached 提出了一种更简单的方法来解决问题;如果完成,您的 QThread 实例将发出一个信号。或者更好的是,在你的线程中创建一个bool isDone,如果它完成了,那么它将是true,或者如果它没有,则为false。如果它是true,那么调用该方法是安全的。但请确保不要在拥有它的线程之外操纵isDone。我建议你只在 QThread 中操作 isDone

这是课程文档:link

大声笑,我严重误解了你的问题。对不起。看来你已经用bWorking 完成了我的第二个建议。

【讨论】:

以上是关于如何保护 QThread 函数,使其在完成之前的工作之前不会再次被调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护类,使其在包外不可见

QThread:如何使用受保护的静态函数

如何终止 QThread?

如何在服务器上部署Django项目并使其在后台一直运行

如何在 4.5 之后附加零以使其在 PHP 中成为 4.50? [复制]

如何更改我的 C++ 代码以使其在 C 中可用?