代码之家  ›  专栏  ›  技术社区  ›  Atilla Filiz

QThread阻塞主应用程序

  •  9
  • Atilla Filiz  · 技术社区  · 14 年前

    void MainWindow::LoadImage()
    {
        aThread->run();
    }
    

    run()方法如下所示:

    void CameraThread::run()
    {
        qDebug("Staring Thread");
        while(1)
        {
            qDebug("ping");
            QThread::sleep(1);
        }
    }
    

    为什么我的线程没有分开运行?派生为公共QThread的CameraThread 我使用gccversion4.4.3(ubuntu4.4.3-4ubuntu5)和来自ubuntu10.04(x86)存储库的QT库和QT创建者。

    3 回复  |  直到 14 年前
        1
  •  33
  •   feedc0de RushPL    7 年前

    简短回答: 通过调用 aThread->start(); run()

    解释

    Calling start() is the correct way 启动线程,因为它提供优先级调度并实际执行 运行() 方法在其自己的线程上下文中。

    看起来您将在这个线程中加载图像,所以我将在您遇到许多人在使用QThread时遇到的陷阱之前提供一些提示

    1. 它只是一个包裹着一根线的包装纸,这让我们想到。。
    2. 中定义的信号/插槽 CameraThread 类不一定在线程的上下文中运行 ,请记住,只有run()方法和从中调用的方法在单独的线程中运行。

    IMHO,在 许多的 头痛。

    class ImageLoader : public QObject {
    Q_OBJECT
    public slots:
        void doWork() 
        {
            // do work
        }
    };
    
    void MainWindow::MainWindow(/*params*/) 
    {
      ImageLoader loader;
      QThread thread;
      loader.moveToThread( &thread );
      connect( this, SIGNAL( loadImage() ), &loader ,SLOT( doWork() ) );
      thread.start();
      // other initialization
    }
    void MainWindow::LoadImage()
    {
       emit loadImage();
    }
    

    同时阅读 Qt blog 关于这个话题。

        2
  •  5
  •   Kamil Klimek    14 年前

        3
  •  -1
  •   Abhishek    14 年前

    我认为问题可能是您没有在构造函数中调用QtCore.QThread.\u init\uuuuuuuux(self)。我也有同样的问题。我还认为不应该重写start函数,而应该重写run()函数。这解决了和我同样的问题。即使没有任何sleep()延迟,窗口也应该是响应的。