Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Exception of multi thread reading QSqlTableModel
Forum Updated to NodeBB v4.3 + New Features

Exception of multi thread reading QSqlTableModel

Scheduled Pinned Locked Moved Solved General and Desktop
39 Posts 5 Posters 4.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • tovaxT Offline
    tovaxT Offline
    tovax
    wrote on last edited by
    #10

    7d9b611a-ea89-451b-94c6-4e275ff6bb43-图片.png
    Main thread: create QTableView to modify the database
    Child thread1: only read database
    Child thread2: read database by "tableModel->data()", and write database by "tableModel->setData()"
    Child thread3: only read database
    All threads must be synchronized.

    1 Reply Last reply
    0
    • tovaxT Offline
      tovaxT Offline
      tovax
      wrote on last edited by
      #11

      In other words, different threads connect to the same database. When one thread updates the data in the database, how do other threads know that the database has been updated? The method of using Signal-Slots between threads seems troublesome.

      JonBJ 1 Reply Last reply
      0
      • tovaxT tovax

        In other words, different threads connect to the same database. When one thread updates the data in the database, how do other threads know that the database has been updated? The method of using Signal-Slots between threads seems troublesome.

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #12

        @tovax said in Exception of multi thread reading QSqlTableModel:

        The method of using Signal-Slots between threads seems troublesome.

        Nonetheless this is indeed the paradigm Qt wants you to use! Why do you find it "troublesome"?

        Although doubtless he is correct --- he usually is! --- I do not share @SGaist's immediate alacrity to move to separate connections per thread. It may be required, but it could be costly on resources/memory/speed/consistency. You might also consider either working on an in-memory, shared copy of the data already read in, or signals/slots to/from the main thread. It depends on what you are doing where.

        tovaxT 1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #13

          @JonB said in Exception of multi thread reading QSqlTableModel:

          It may be required,

          It is required - QSqlDatabase database connection is not thread-safe.

          how do other threads know that the database has been updated?

          Use signals/slots

          The method of using Signal-Slots between threads seems troublesome.

          Why? It's much easier than using semaphores and wait conditions.

          But still don't see why you need threads in the first place.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          JonBJ tovaxT 2 Replies Last reply
          0
          • JonBJ JonB

            @tovax said in Exception of multi thread reading QSqlTableModel:

            The method of using Signal-Slots between threads seems troublesome.

            Nonetheless this is indeed the paradigm Qt wants you to use! Why do you find it "troublesome"?

            Although doubtless he is correct --- he usually is! --- I do not share @SGaist's immediate alacrity to move to separate connections per thread. It may be required, but it could be costly on resources/memory/speed/consistency. You might also consider either working on an in-memory, shared copy of the data already read in, or signals/slots to/from the main thread. It depends on what you are doing where.

            tovaxT Offline
            tovaxT Offline
            tovax
            wrote on last edited by
            #14

            @JonB said in Exception of multi thread reading QSqlTableModel:

            gm Qt wants you to use! Why do you find it "troubles

            If there are more threads that modify the database, then it is necessary to establish signal slot connections from these threads to all other threads.

            KroMignonK 1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #15

              @tovax said in Exception of multi thread reading QSqlTableModel:

              then it is necessary to establish signal slot connections from these threads to all other threads.

              That's also true when you don't use signals and slots...

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              1 Reply Last reply
              0
              • Christian EhrlicherC Christian Ehrlicher

                @JonB said in Exception of multi thread reading QSqlTableModel:

                It may be required,

                It is required - QSqlDatabase database connection is not thread-safe.

                how do other threads know that the database has been updated?

                Use signals/slots

                The method of using Signal-Slots between threads seems troublesome.

                Why? It's much easier than using semaphores and wait conditions.

                But still don't see why you need threads in the first place.

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #16

                @Christian-Ehrlicher said in Exception of multi thread reading QSqlTableModel:

                It may be required,

                It is required - QSqlDatabase database connection is not thread-safe.

                Yes, I was the first person to say that if you want to access a QSqlDatabase database connection you must only do so from its owning thread. If you read what I was saying, I was talking about not having multiple database connections, as an alternative.

                If, for whatever reason, the user wants to have 100 threads running accessing data read from the database, having 100 separate database connections is not an advisable approach. IMHO.

                tovaxT 1 Reply Last reply
                0
                • Christian EhrlicherC Christian Ehrlicher

                  @JonB said in Exception of multi thread reading QSqlTableModel:

                  It may be required,

                  It is required - QSqlDatabase database connection is not thread-safe.

                  how do other threads know that the database has been updated?

                  Use signals/slots

                  The method of using Signal-Slots between threads seems troublesome.

                  Why? It's much easier than using semaphores and wait conditions.

                  But still don't see why you need threads in the first place.

                  tovaxT Offline
                  tovaxT Offline
                  tovax
                  wrote on last edited by
                  #17

                  @Christian-Ehrlicher said in Exception of multi thread reading QSqlTableModel:

                  But still don't see why you need threads in the first place.

                  The time-consuming trajectory algorithm and real-time motion control algorithm in the application program need to be processed by separate threads, which will use the parameter data in the database.

                  1 Reply Last reply
                  0
                  • tovaxT tovax

                    @JonB said in Exception of multi thread reading QSqlTableModel:

                    gm Qt wants you to use! Why do you find it "troubles

                    If there are more threads that modify the database, then it is necessary to establish signal slot connections from these threads to all other threads.

                    KroMignonK Offline
                    KroMignonK Offline
                    KroMignon
                    wrote on last edited by
                    #18

                    @tovax said in Exception of multi thread reading QSqlTableModel:

                    If there are more threads that modify the database, then it is necessary to establish signal slot connections from these threads to all other threads.

                    As @Christian-Ehrlicher already written, QSqlDatabase is not thread-safe, so you have 2 options:

                    • do all DB stuff in one thread, by using signals/slots it is quit easy.
                    • use as many QSqlDatabase connections as you have threads ==> take a look here for example: https://forum.qt.io/topic/103626/problem-with-sqlite-database-and-threads-database-is-locked/14

                    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                    tovaxT 1 Reply Last reply
                    0
                    • JonBJ JonB

                      @Christian-Ehrlicher said in Exception of multi thread reading QSqlTableModel:

                      It may be required,

                      It is required - QSqlDatabase database connection is not thread-safe.

                      Yes, I was the first person to say that if you want to access a QSqlDatabase database connection you must only do so from its owning thread. If you read what I was saying, I was talking about not having multiple database connections, as an alternative.

                      If, for whatever reason, the user wants to have 100 threads running accessing data read from the database, having 100 separate database connections is not an advisable approach. IMHO.

                      tovaxT Offline
                      tovaxT Offline
                      tovax
                      wrote on last edited by
                      #19

                      @JonB
                      Yes, I agree with you. In extreme cases, establishing separate database connections should be very resource intensive. At present, I prefer to share memory copies.

                      1 Reply Last reply
                      0
                      • KroMignonK KroMignon

                        @tovax said in Exception of multi thread reading QSqlTableModel:

                        If there are more threads that modify the database, then it is necessary to establish signal slot connections from these threads to all other threads.

                        As @Christian-Ehrlicher already written, QSqlDatabase is not thread-safe, so you have 2 options:

                        • do all DB stuff in one thread, by using signals/slots it is quit easy.
                        • use as many QSqlDatabase connections as you have threads ==> take a look here for example: https://forum.qt.io/topic/103626/problem-with-sqlite-database-and-threads-database-is-locked/14
                        tovaxT Offline
                        tovaxT Offline
                        tovax
                        wrote on last edited by
                        #20

                        @KroMignon said in Exception of multi thread reading QSqlTableModel:

                        do all DB stuff in one thread, by using signals/slots it is quit easy.

                        It's easy to write data by using signals/slots, but is it necessary to copy a memory copy for reading data? Because DB data cannot be read directly from other threads...

                        JonBJ 1 Reply Last reply
                        1
                        • tovaxT tovax

                          @KroMignon said in Exception of multi thread reading QSqlTableModel:

                          do all DB stuff in one thread, by using signals/slots it is quit easy.

                          It's easy to write data by using signals/slots, but is it necessary to copy a memory copy for reading data? Because DB data cannot be read directly from other threads...

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by JonB
                          #21

                          @tovax
                          Yes, this is the issue. As you say, emitting a signal to ask the main thread to do a write (setData()) for your thread is not so difficult. Your problem comes on trying to synchronise read access (data()).

                          It is easier to maintain per-thread connections for that purpose. But that comes with other overheads, as discussed. Depends on how much of what you need to do when.

                          1 Reply Last reply
                          0
                          • Christian EhrlicherC Offline
                            Christian EhrlicherC Offline
                            Christian Ehrlicher
                            Lifetime Qt Champion
                            wrote on last edited by
                            #22

                            Again: why do you think you need threads for simple reading data from the database? What heaviy computation do you do with those values?

                            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                            Visit the Qt Academy at https://academy.qt.io/catalog

                            tovaxT 1 Reply Last reply
                            1
                            • Christian EhrlicherC Christian Ehrlicher

                              Again: why do you think you need threads for simple reading data from the database? What heaviy computation do you do with those values?

                              tovaxT Offline
                              tovaxT Offline
                              tovax
                              wrote on last edited by
                              #23

                              @Christian-Ehrlicher
                              The main purpose of thread is to process time-consuming algorithms and real-time control. Reading data from the database is only to obtain the global parameters needed in the algorithm and control process.

                              JonBJ KroMignonK 2 Replies Last reply
                              0
                              • Christian EhrlicherC Offline
                                Christian EhrlicherC Offline
                                Christian Ehrlicher
                                Lifetime Qt Champion
                                wrote on last edited by Christian Ehrlicher
                                #24

                                Then read your data in one thread, start/inform the workers that there is data and let them do the work. When you a mutex to protect read/write access to your data you don't even need to copy it. But that's plain threading stuff which you should read about before trying to actually writing something. Threading is not easy and should be avoided when not really needed for basic programmers.

                                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                Visit the Qt Academy at https://academy.qt.io/catalog

                                tovaxT 1 Reply Last reply
                                1
                                • tovaxT tovax

                                  @Christian-Ehrlicher
                                  The main purpose of thread is to process time-consuming algorithms and real-time control. Reading data from the database is only to obtain the global parameters needed in the algorithm and control process.

                                  JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by JonB
                                  #25

                                  @tovax
                                  I was going to say as @Christian-Ehrlicher has just said. Can you not take the reading from the database outside the threads and then access some shared data only for the computations.

                                  @Christian-Ehrlicher
                                  Isn't the following a problem: is it not the case that for a reader accessing data() that calls rowCount() and that can cause physical call to database for fetchMore()?? Or does data()/rowCount() never do that, I can't recall?

                                  1 Reply Last reply
                                  0
                                  • Christian EhrlicherC Christian Ehrlicher

                                    Then read your data in one thread, start/inform the workers that there is data and let them do the work. When you a mutex to protect read/write access to your data you don't even need to copy it. But that's plain threading stuff which you should read about before trying to actually writing something. Threading is not easy and should be avoided when not really needed for basic programmers.

                                    tovaxT Offline
                                    tovaxT Offline
                                    tovax
                                    wrote on last edited by
                                    #26

                                    @Christian-Ehrlicher

                                    Some results of time-consuming algorithm and motion control need to be written to database, such as time, current position and so on. In other words, there will be frequent data interaction between some child threads and the database.

                                    1 Reply Last reply
                                    0
                                    • tovaxT tovax

                                      @Christian-Ehrlicher
                                      The main purpose of thread is to process time-consuming algorithms and real-time control. Reading data from the database is only to obtain the global parameters needed in the algorithm and control process.

                                      KroMignonK Offline
                                      KroMignonK Offline
                                      KroMignon
                                      wrote on last edited by
                                      #27

                                      @tovax said in Exception of multi thread reading QSqlTableModel:

                                      The main purpose of thread is to process time-consuming algorithms and real-time control. Reading data from the database is only to obtain the global parameters needed in the algorithm and control process.

                                      I think you are "over-engineering" your programm.
                                      For me, the steps your need are:

                                      • getting computation parameters from db
                                      • starting multiple computation operations

                                      So I would do it like @Christian-Ehrlicher said:

                                      • in main thread preparing data for computation ==> reading required data from DB
                                      • start thread for computation ==> I would do it with QtConcurrent::run() and dedicated QThreadPool to avoid thread creation/destruction and to be able to wait for computation end with QFutureWatcher.

                                      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                                      tovaxT 1 Reply Last reply
                                      0
                                      • KroMignonK KroMignon

                                        @tovax said in Exception of multi thread reading QSqlTableModel:

                                        The main purpose of thread is to process time-consuming algorithms and real-time control. Reading data from the database is only to obtain the global parameters needed in the algorithm and control process.

                                        I think you are "over-engineering" your programm.
                                        For me, the steps your need are:

                                        • getting computation parameters from db
                                        • starting multiple computation operations

                                        So I would do it like @Christian-Ehrlicher said:

                                        • in main thread preparing data for computation ==> reading required data from DB
                                        • start thread for computation ==> I would do it with QtConcurrent::run() and dedicated QThreadPool to avoid thread creation/destruction and to be able to wait for computation end with QFutureWatcher.
                                        tovaxT Offline
                                        tovaxT Offline
                                        tovax
                                        wrote on last edited by
                                        #28

                                        f6eac6e3-dc96-4302-b4a7-013d02ffa0f2-图片.png
                                        For example, the results generated by child thread1 need to be written to the database, and used by child thread2.

                                        JonBJ SGaistS KroMignonK 3 Replies Last reply
                                        0
                                        • tovaxT tovax

                                          f6eac6e3-dc96-4302-b4a7-013d02ffa0f2-图片.png
                                          For example, the results generated by child thread1 need to be written to the database, and used by child thread2.

                                          JonBJ Offline
                                          JonBJ Offline
                                          JonB
                                          wrote on last edited by
                                          #29

                                          @tovax
                                          Most important decision: do you really mean that thread1 must physically write to the database and thread2 must physically (re-)read the data from the database, or do you mean that thread2 can/should read the (changed) data in-memory.

                                          tovaxT 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved