Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 创建连接时线程是否应该运行?_Database_Multithreading_Qt_Qthread - Fatal编程技术网

Database 创建连接时线程是否应该运行?

Database 创建连接时线程是否应该运行?,database,multithreading,qt,qthread,Database,Multithreading,Qt,Qthread,只能从创建连接的线程内部使用连接。 在线程之间移动连接或从 不支持不同的线程。此外,第三方 QSqlDrivers使用的库可以对 在多线程程序中使用SQL模块。请参阅本手册 有关详细信息,请访问数据库客户端 我研究了一些相关的Qt类,没有发现与线程和数据库连接相关的代码。似乎Qt将该任务留给了数据库驱动程序,因为 不支持在线程之间移动连接或从其他线程创建查询 我认为,如果我们不同时使用来自两个线程的连接,那么无论何时何地创建(并使用)连接都无关紧要 添加连接时线程是否应该运行 我们真的必须只在创

只能从创建连接的线程内部使用连接。 在线程之间移动连接或从 不支持不同的线程。此外,第三方 QSqlDrivers使用的库可以对 在多线程程序中使用SQL模块。请参阅本手册 有关详细信息,请访问数据库客户端

我研究了一些相关的Qt类,没有发现与线程和数据库连接相关的代码。似乎Qt将该任务留给了数据库驱动程序,因为 不支持在线程之间移动连接或从其他线程创建查询

我认为,如果我们不同时使用来自两个线程的连接,那么无论何时何地创建(并使用)连接都无关紧要

  • 添加连接时线程是否应该运行
  • 我们真的必须只在创建连接的线程中使用连接吗

  • ::run方法是线程入口点。它将在新线程中执行。QThread构造函数将在初始化和启动QThread的线程中执行。所以,若要在创建的线程中使用数据库对象,那个么请确保在这个新线程中调用它::run方法是线程入口点。它将在新线程中执行。QThread构造函数将在初始化和启动QThread的线程中执行。所以,如果您要在创建的线程中使用数据库对象,那么您要确保它将在这个新线程中被调用

    比方说,每当我们添加连接时,我们都会给出唯一的连接名称。如果我们将它添加到ctor中,然后在线程实际运行时使用它,这有关系吗?。。。我强调的文档中的这句话似乎不仅仅是一个指导原则,而不是一个限制。我不明白为什么“一个连接只能在创建它的线程中使用”更像是一条指导线而不是一个限制。这显然是对我的限制。如果由数据库来处理多线程,我将其视为“一个连接只应…”,因为Qt似乎在内部不将连接和线程关联起来。比如说,每当我们添加连接时,我们都会给出唯一的连接名称。如果我们将它添加到ctor中,然后在线程实际运行时使用它,这有关系吗?。。。我强调的文档中的这句话似乎不仅仅是一个指导原则,而不是一个限制。我不明白为什么“一个连接只能在创建它的线程中使用”更像是一条指导线而不是一个限制。这对我来说显然是一个限制。如果由数据库来处理多线程,我将其视为“一个连接应该只…”,因为Qt似乎在内部不将连接和线程关联起来。
    class Worker : public QThread
    {
        Q_OBJECT
    
    public:
       Worker()
       {
          // Here?
          QSqlDatabase::addDatabase("QSQLITE", "connectionName");
    
          ...
       }
    
       void Worker::run()
       {
          // Or here?
          QSqlDatabase::addDatabase("QSQLITE", "connectionName");
    
          ...
       }
    
      ...
    };