当上一个槽已经写入并且还没有完成时,阻止一个槽执行一个方法

Qt-C++ Preventing a slot to execute a method, when a previous slot already dit and has not finished

本文关键字:一个 方法 执行 完成时 上一个 还没有      更新时间:2023-10-16

在我的项目中,我有几个对象收集一些数据并将它们放入数据库,现在由于某些原因数据库链接可能会失败,所以我为它发出信号并将其绑定到一个插槽,该插槽将在日志文件中写入发生的事情并尝试重新连接到数据库。

现在的问题是,有时会发生一个信号触发槽,然后尝试重新连接到数据库,而之前的连接正在进行中。当对象在一个非常小的间隔内发送几个请求时,这个问题总是会发生,因为一旦请求失败,就会发出信号来重新建立连接。

所以我想要的是一个适当的方法来防止任何插槽调用"connectToDatabase()"方法时,另一个插槽已经这样做了,以便该方法将正确结束。

在这里。

void mainFrame::reconnectDatabase(QSqlQuery *failedQuery)
{ 
    log_it("QUERY:""+failedQuery->lastQuery()+"" ERROR:""+failedQuery->lastError().text()+""");
    log_it("Re-connecting to Database...");
    QSqlDatabase db = QSqlDatabase::database();
    if(!db.open())
        log_it("Reconnecting database operation failed! REASON: ""+db.lastError().text()+""");
}

log_it()是我写日志的函数

您可以通过布尔检查来完成此操作,指示连接数据库的尝试已经在进行中。

void MyClass::slotConnectToDatabase()
{
    if (m_connectingToDatabase)
        return;
    m_connectingToDatabase = true;
    // connect to database
    m_connectingToDatabase = false;
}

第一次调用connectToDatabase时,可以设置一个布尔变量为true,表示调用了connectToDatabase。在connectToDatabase方法中,您可以检查此变量并返回,如果它为真:

void connectToDatabase()
{
    if(!connected)
         connected = true;
    else
         return;
    //...
}