标签: qthread

在PyQt中使用QThread的后台线程

我有一个程序,通过我在PyQt中编写的gui与我正在使用的收音机连接.显然,无线电的一个主要功能是传输数据,但为了不断地这样做,我必须循环写入,这会导致gui挂起.因为我从未处理过线程,所以我试图摆脱这些挂起使用QCoreApplication.processEvents().无线电需要在传输之间休眠,所以gui仍然根据这些睡眠的持续时间而挂起.

有没有一种简单的方法可以使用QThread来解决这个问题?我已经找到了有关如何使用PyQt实现多线程的教程,但是大多数都涉及设置服务器,并且比我需要的更先进.老实说,我甚至不需要我的线程在运行时更新任何东西,我只需要启动它,让它在后台传输,然后停止它.

python multithreading pyqt pyqt4 qthread

68
推荐指数
6
解决办法
10万
查看次数

实现QThread的正确方法是什么......(请举例......)

QThread的Qt文档说是从QThread创建一个类,并实现run方法.

以下内容来自4.7 Qthread文档......

要创建自己的线程,请继承QThread并重新实现run().例如:

 class MyThread : public QThread
 {
 public:
     void run();
 };

 void MyThread::run()
 {
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
 }
Run Code Online (Sandbox Code Playgroud)

所以在我创建的每一个线程中,我都做到了这一点,并且对于大多数事情来说它工作正常(我没有在我的任何对象中实现moveToThread(this)并且它工作得很好).

我上周遇到了障碍(设法通过解决我创建对象的地方来解决它)并找到了以下博文.这里基本上说子类化QThread确实不是正确的方法(并且文档不正确).

这是来自Qt的开发人员,所以乍一看我很感兴趣,经过进一步的反思,同意他.按照OO原则,你真的只想子类化一个类来进一步增强该类......不要直接使用类方法......这就是为什么要实例化...

让我们说我想将一个自定义QObject类移动到一个线程......这样做的"正确"方法是什么?在那篇博客文章中,他说'他在某个地方有一个例子......但如果有人可以向我进一步解释它,我将不胜感激!

更新:

由于这个问题引起了如此多的关注,下面是4.8文档的复制和粘贴,以及实现QThread的"正确"方式.

class Worker : public QObject
 {
     Q_OBJECT
     QThread workerThread;

 public slots:
     void doWork(const QString &parameter) {
         // ...
         emit resultReady(result);
     }

 signals:
     void resultReady(const QString &result);
 };

 class Controller : public QObject
 {
     Q_OBJECT
     QThread workerThread;
 public:
     Controller() {
         Worker *worker = …
Run Code Online (Sandbox Code Playgroud)

qt multithreading qt4 qthread

62
推荐指数
2
解决办法
7万
查看次数

Qt信号(QueuedConnection和DirectConnection)

我在使用Qt信号时遇到问题.

我不明白怎么做DirectConnectionQueuedConnection有效?

如果有人会解释何时使用其中的哪一个(示例代码将被赞赏),我将感激不尽.

c++ qt qthread qt-signals

44
推荐指数
2
解决办法
6万
查看次数

在PyQt中使用QThread的正确方法示例?

我正在尝试学习如何在PyQt Gui应用程序中使用QThreads.我有一些运行一段时间的东西,有(通常)点我可以更新一个Gui,但我想将主要工作拆分到它自己的线程(有时候东西会卡住,最终会有一个很好的取消/再试一次按钮,如果由于主循环被阻止,Gui被冻结,这显然不起作用).

我已阅读https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/.该页面说重新实现该run方法不是这样做的方法.我遇到的问题是找到一个PyQt示例,其中有一个主线程正在执行Gui,而一个工作线程没有这样做.这篇博文是针对C++的,所以虽然它的例子确实有帮助,但我仍然有点失落.有人可以请给我一个在Python中正确方法的例子吗?

python pyqt pyqt4 qthread

30
推荐指数
1
解决办法
5万
查看次数

跨线程的Qt信令,一个是GUI线程?

使用moveToThread在Qt中将对象从一个线程移动到另一个线程是什么意思?甚至在使用moveToThread之前,一切似乎都工作,moveToThread将对象从一个线程(GUI线程)移动到另一个线程(工作),Qt:connect调用对象上的相应插槽.

由于对象所在的位置,GUI线程或工作线程,有什么区别吗?

编辑:我做了一个小程序,但我不明白QThread如何与Signal和插槽功能一起工作,如果你能解释一下moveToThread的用法,我将不胜感激

#include <QtGui/QApplication>
#include <QPushButton>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QString>
#include "mythread.h"
//GUI calls a thread to do some job and sub update the text box once it is done
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QHBoxLayout * pH = new QHBoxLayout(&w);
    QPushButton * pushButton = new QPushButton("asdad");
    QLineEdit * lineEdit = new QLineEdit("AAA");
    pH->addWidget(pushButton);
    pH->addWidget(lineEdit);
    w.setLayout(pH);
    w.show();
    MyThread thread;
    qDebug("Thread id %d",(int)QThread::currentThreadId());
    QObject::connect(pushButton,SIGNAL(clicked()),&thread,SLOT(callRun())) ;
    QObject::connect(&thread,SIGNAL(signalGUI(QString)),lineEdit,SLOT(setText(QString)));
    return a.exec();
}

#ifndef MYTHREAD_H
#define …
Run Code Online (Sandbox Code Playgroud)

user-interface qt signals-slots qthread

28
推荐指数
2
解决办法
4万
查看次数

发送自定义PyQt信号?

我正在通过制作一个简单的Twitter客户端来练习PyQt和(Q)线程.我有两个Qthreads.

  1. 主/ GUI线程.

  2. Twitter获取线程 - 每隔X分钟从Twitter获取数据.

因此,每隔X分钟我的Twitter线程就会下载一组新的状态更新(Python列表).我想将此列表交给Main/GUI线程,以便它可以使用这些状态更新窗口.

我假设我应该使用信号/插槽系统将"状态"Python列表从Twitter线程传输到Main/GUI线程.所以,我的问题是双重的:

  1. 如何从Twitter线程发送状态?

  2. 如何在Main/GUI线程中收到它们?

据我所知,PyQt默认只能通过信号/插槽发送PyQt对象.我想我应该以某种方式注册一个我可以发送的自定义信号,但我发现的这个文档对于像我这样的新手来说是非常不清楚的.我订购了一本PyQt书,但它不会在另一周到来,我不想等到那时.:-)

我在Ubuntu上使用PyQt 4.6-1

更新:

这是一个不起作用的代码.首先,我尝试将信号("newStatuses",我刚刚编写的名称)"连接"到Main/GUI线程中的函数self.update_tweet_list:

QtCore.QObject.connect(self.twit_in,
                       QtCore.SIGNAL("newStatuses (statuses)"),
                       self.update_tweet_list)
Run Code Online (Sandbox Code Playgroud)

然后,在Twitter主题中,我这样做:

self.emit(SIGNAL("newStatuses (statuses)"), statuses)
Run Code Online (Sandbox Code Playgroud)

调用此行时,我收到以下消息:

QObject::connect: Cannot queue arguments of type 'statuses'
(Make sure 'statuses' is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud)

我搜索了qRegisterMetaType(),但是我找不到任何与Python有关的东西,我能理解.

python pyqt pyqt4 qthread

28
推荐指数
4
解决办法
3万
查看次数

如何在Qt中使用排队连接时压缩插槽调用?

读了一些文章后,像这样关于Qt信号插槽通信还是有关于排队的连接问题.

如果我有一些线程一直向对方发送信号,并且假设一个thread_slow在它的事件循环中运行一个慢速方法而另一个thread_fast运行一个快速的方法发送多个信号,而另一个线程仍在运行它的慢速方法...... ..当thread_slow返回到事件循环的慢速方法时,它会处理之前发送的所有信号thread_fast还是最后一个发送的所有信号(所有信号都是相同的类型)?

如果它将处理所有信号,是否有办法使thread_slow 唯一的过程成为最后一个?(考虑到多线程应用程序中的"最后一个"可能是模糊的,让我们考虑线程要求最后一个信号之前的最后一个信号,为了简单起见,所以在线程查找最后一个时发送的新信号可能会丢失).

(我问这个是因为我有多个线程从多个线程接收数据,我不希望它们处理旧数据,只是最后一个发送的数据)

我已经进行了一些测试,看来Qt将处理所有信号.我做了一个线程:

while(true)
{
    QThread::msleep(500);
    emit testQueue(test);
    test++;
}
Run Code Online (Sandbox Code Playgroud)

另一个插槽将执行:

void test::testQueue(int test)
{
    test.store(private_test.load() + test);
    emit testText(QString("Test Queue: ") + QString::number(private_test.load()));
}
Run Code Online (Sandbox Code Playgroud)

并且线程将运行:

while(true)
{
    QThread::msleep(3000);
    QCoreApplication::processEvents();
    private_test.store(private_test.load() + 1000);
}
Run Code Online (Sandbox Code Playgroud)

我每隔500毫秒从一个线程向另一个线程发送一个信号,另一个线程休眠3000毫秒(3秒)然后唤醒并将内部变量递增100.每次执行一个插槽时它会发出一个文本收到的值+内部变量.我得到的结果是,每次 QCoreApplication::processEvents();调用,所有信号都被执行....(我编辑了这部分是因为我在之前的代码中发现了一个错误)

c++ qt qthread qt-signals qtcore

22
推荐指数
2
解决办法
7450
查看次数

在Qt线程之间发送大量数据

我有一个QThread定期生成相当大量的数据(每秒几兆字节),并且需要将其传输到父(GUI)线程.

我担心我在内部工作中并不确定,QThread所以我想要求最佳实践.

显然,传输数据的最直接方式是仅emit使用数组.但是,这有多高效?Qt是否知道它的使用位置并避免在发送和接收时对其进行深度复制?

如果没有,我很乐意只在主线程中分配内存并给出一个指向子线程的指针,它将写入数据(并且只有emit关于进度的短消息).这对我来说似乎不是最优雅的解决方案,这就是我要问的原因.

如果Qt避免在发送和接收时复制多个缓冲区中的数据,是否可以在所有系统中保证?我没有资源在各种操作系统下尝试对其进行基准测试.

c++ qt multithreading qthread

20
推荐指数
2
解决办法
9356
查看次数

我该如何终止QThread

最近,我遇到了这个问题,正如我在本标题中所记得的那样.我已经尝试过使用QThread :: terminate(),但我无法阻止线程,这是一个死循环(让我们说,while(1)).

非常感谢.

qt qthread

17
推荐指数
2
解决办法
2万
查看次数

QThread:线程仍在运行时被销毁

我在python中遇到QThreads的问题.我想改变标签的背景颜色.但我的应用程序在启动时崩溃."QThread:在线程仍在运行时被破坏"

   class MainWindow(QMainWindow):
      def __init__(self):
          QMainWindow.__init__(self)
          self.ui = Ui_MainWindow()
          self.ui.setupUi(self)

          statusTh = statusThread(self)
          self.connect(statusTh, SIGNAL('setStatus'), self.st, Qt.QueuedConnection)
          statusTh.start()

      def st(self):
          if self.status == 'ON':
              self.ui.label.setStyleSheet('background-color:green')
          else:
              self.ui.label.setStyleSheet('background-color:red')

  class statusThread(QThread):
      def __init__(self, mw):
          super(statusThread, self).__init__()

      def run(self):
          while True:
              time.sleep(1)
              self.emit(SIGNAL('setStatus'))

  if __name__ == "__main__":
      app = QApplication(sys.argv)
      main_window = MainWindow()
      main_window.show()
      sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

python pyqt qthread

16
推荐指数
1
解决办法
1万
查看次数