Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Chinese
  4. emit 大量信号后,界面卡住问题
Forum Updated to NodeBB v4.3 + New Features

emit 大量信号后,界面卡住问题

Scheduled Pinned Locked Moved Solved Chinese
7 Posts 5 Posters 2.8k Views
  • 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.
  • P Offline
    P Offline
    Prophecy2021
    wrote on last edited by JKSH
    #1

    各位好,我遇到了一个问题。我有一个表 QTreeView 的子类,设置了一个 QStandItemModel 和 QSortFilterProxyModel。添加数据的逻辑逻辑是,点击导入数据后,请求被下发到了其他线程处理,处理完成,通过自定义的信号槽,emit到主线程,完成最后的这个界面显示插入列表工作,emit是基于项的,也就是导入上万条的话,会有上万次emit。当我测试时发现,emit了 20000 次信号后,会出现卡死状态。通过打印,发现主线程一直在处理槽函数,完全无法响应界面操作提示,我如何避免这种情况,我不需要给导入数据提速,只需要数据就能顺利完成其他画面的显示到界面,操作也可以画面进行。

    jsulmJ 1 Reply Last reply
    0
    • P Prophecy2021

      各位好,我遇到了一个问题。我有一个表 QTreeView 的子类,设置了一个 QStandItemModel 和 QSortFilterProxyModel。添加数据的逻辑逻辑是,点击导入数据后,请求被下发到了其他线程处理,处理完成,通过自定义的信号槽,emit到主线程,完成最后的这个界面显示插入列表工作,emit是基于项的,也就是导入上万条的话,会有上万次emit。当我测试时发现,emit了 20000 次信号后,会出现卡死状态。通过打印,发现主线程一直在处理槽函数,完全无法响应界面操作提示,我如何避免这种情况,我不需要给导入数据提速,只需要数据就能顺利完成其他画面的显示到界面,操作也可以画面进行。

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @Prophecy2021 Please use this forum if you want to ask using Chinese: https://forum.qt.io/category/37/chinese

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1
      • P Offline
        P Offline
        Prophecy2021
        wrote on last edited by Prophecy2021
        #3
        This post is deleted!
        1 Reply Last reply
        0
        • P Offline
          P Offline
          Prophecy2021
          wrote on last edited by
          #4

          感谢大家的关注,我这边已经解决问题了。问题根本在于emit了太多的消息到主线程。所以,如果connect时使用了Qt::BlockingQueuedConnection,可以完美解决这个问题。这个参数正好解决我们当前场景遇到的问题。

          L 1 Reply Last reply
          0
          • K Offline
            K Offline
            KQ9981
            wrote on last edited by
            #5

            用阻塞队列会不会影响效率啊

            S 1 Reply Last reply
            0
            • P Prophecy2021

              感谢大家的关注,我这边已经解决问题了。问题根本在于emit了太多的消息到主线程。所以,如果connect时使用了Qt::BlockingQueuedConnection,可以完美解决这个问题。这个参数正好解决我们当前场景遇到的问题。

              L Offline
              L Offline
              lwei2
              wrote on last edited by
              #6

              @Prophecy2021 said in emit 大量信号后,界面卡住问题:

              感谢大家的关注,我这边已经解决问题了。问题根本在于emit了太多的消息到主线程。所以,如果connect时使用了Qt::BlockingQueuedConnection,可以完美解决这个问题。这个参数正好解决我们当前场景遇到的问题。
              老兄,我也遇到类似你的场景,目前emit很多次后,当主线程接收到子线程发送回来的信号,就会弹框。一旦弹框多了,就会出现主界面假死的情况,弹框提示一般以模态的方式显示,即QDialog dialog; dialog.exec();
              按照你的方式去做,在connect的第五个参数添加Qt::BlockingQueuedConnection,好像还是会有假死的现象,请问您有什么办法可以优化吗?

              1 Reply Last reply
              0
              • K KQ9981

                用阻塞队列会不会影响效率啊

                S Offline
                S Offline
                Smalldy
                wrote on last edited by
                #7

                @KQ9981 我认为会的 万一处理端任务量大就GG了

                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