- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在研究有关 PySide 线程的以下问题,但我发现的文档很少,因此这里有一篇关于我的发现的长篇文章,希望能得到一些关于其进展情况的简洁反馈。假设我们正在构建一个调用某些 Linux 进程的多线程 GUI 应用程序。我们将使用 QThread 类从内部调用 QProcess,目的是让应用程序在准备就绪时同时运行多个进程(在不同的线程中)
我只使用 QThread 类并从 QApplication 主循环开始
情况1:- 我们将线程终止信号连接到调用 self.exit 的同一类的另一个函数(以便线程类退出)- 按照 PySide 官方文档 http://tinyurl.com/qh7cooa 中的指示,没有调用 self.exec_()
#!/usr/bin/python3.2
from PySide import QtGui
from PySide import QtCore
import sys, random
class ProcThread(QtCore.QThread):
def __init__(self, parent=None):
super(ProcThread, self).__init__(parent)
def run(self):
try:
self.qproc = QtCore.QProcess()
self.finished.connect(self.threadFinished)
filename = "/home/user1/Desktop/fileno"+str(random.randint(1, 10000))+".txt"
self.qproc.start("touch", [filename])
except Exception as error:
print(str(error))
raise(error)
#self.exec_()
def threadFinished(self):
print("Thread has finished")
self.qproc.close()
app = QtGui.QApplication(sys.argv)
procthread = ProcThread()
procthread.start()
app.exec_()
结果:捕获线程终止(打印消息“线程已完成”),进程确实运行(创建文件),但应用程序不退出
情况2:与之前相同,但现在也调用self._exec()
(取消前面代码片段中相关行的注释)结果:线程终止未被捕获,进程确实运行(文件被创建),并且在 Ctrl+Z 之后应用程序再次不退出(仍然作为后台作业)/必须显式终止它
情况3:现在连接QProcess
时发出的信号通过 self.qproc.finished.connect(self.threadFinished)
终止。没有调用 self.exec_()
self.qproc = QtCore.QProcess()
self.qproc.finished.connect(self.threadFinished)
filename = "/home/pantelis/Desktop/fileno" + str(random.randint(1, 10000)) + ".txt"
self.qproc.start("touch", [filename])
结果:与情况 2 一样 - 未捕获线程终止,进程确实运行(创建文件),并且应用程序再次不退出
情况 4:与情况 1 相同,但现在在 threadFinished
中添加以下行 self.exit()
结果:与情况 2 一样 - 线程终止未被捕获,进程确实运行(文件被创建),并且应用程序再次不退出
案例 5:与案例 4 一样,只需取消注释 self.exec_()
结果:线程终止(打印消息“线程已完成”),文件创建,应用程序再次不退出
案例 6、7、8:已添加 self.qproc.close() / self.qproc.terminate() / self.qproc.kill()
在threadFinished
从特定函数显式终止 QProcess结果:如案例 5
还可以尝试不同的替代方案,例如链接 self.terminated
QThread
的信号至threadFinished
等等。一些非常粗糙的问题,尽管我认为这是一个复杂的问题:- 为什么尽管正式文档指出调用 QThread
的exec_()
函数对于线程启动事件处理是必需的,这似乎是在没有调用特定函数的情况下发生的- 在某些情况下,线程终止被 threadFinished
捕获/处理。在某些情况下并非如此- 最重要的是:为什么应用程序不终止? (我也尝试过app = QtCore.QCoreApplication(sys.argv)
)
最佳答案
只需在 threadFinished
处理程序中调用 app.quit()
即可,如果您有可见的小部件,则 hide()
和 destroy()
主窗口,这应该负责销毁所有子窗口。
关于python - PySide:QThread 事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723384/
我想写一些必须在自己的线程中工作的类。我读过这篇文章:http://wiki.qt.io/Threads_Events_QObjects。它建议移动必须在自己的线程中工作的对象,例如: TestCla
在调用所有与 QThread::finished() 信号关联的槽后,QThread::wait() 是否返回(即解除阻塞执行)? 提前致谢。 最佳答案 不,它可能会在与信号 finished() 关
我不是在打电话 exec()在我的代码中,但 timer和 QUdpSocket工作正常。是 exec()用于等待 event接着说? 更新:timer正在工作,因为我没有调用 moveToThrea
如果我创建 QThread 作为局部变量,我发现了一个奇怪的行为。 例如,下面的代码将作为单线程工作,这意味着我需要等待 10 秒,结果才会出来。 但是如果我将线程从局部变量更改为成员变量,它将作为多
I solved my issue by moving the mySubQThread run() into the myQThread run() That said, I still would
一段时间以来,我一直在使用 Qt 开发一个应用程序,在该应用程序中我必须从相机中抓取帧。相机将在与应用程序其余部分不同的线程中运行。我遵循了以下建议: http://mayaposch.wordpre
考虑以下代码片段: class ThreadA::QThread { public: ThreadA() { } void run() { myVariable = n
所以我在构造函数中有以下代码。 m_someObject = new SomeObject(); m_someObject->moveToThread(&m_thread); m_thread.sta
我有 3 个 QThreads 相互调用(全部继承自 QThread。我知道有些人可能建议使用 moveToThread,但暂时忽略这个事实)。简化的代码如下所示: Thread1 类: void T
我想知道 new QThread(this) 和 new QThread() 之间有什么区别,以及这将如何影响我的代码在使用 QThread 时的行为. 最佳答案 QThread 的父级谁执行什么没有
我是 PySide2 的新手。我只是想启动一个示例应用程序并在应用程序启动时启动一个线程,并希望在应用程序关闭时停止该线程。当我关闭应用程序时,我收到以下错误:QThread:在线程仍在运行时销毁。s
关于如何实例化和使用 QThread 的官方文档可以在这里找到: http://doc.qt.io/qt-5/qthread.html 该文档描述了两种基本方法:(1) 工作对象方法和 (2) QTh
我有以下设置: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create the DBM
这是 QTread 的子对象...并在主线程中将其具体化.... 运行时错误如下: ASSERT failure in QCoreApplication::sendEvent: "Cannot sen
在过去的几天里,我一直在尝试使用 QThreads 而不对 QThread 进行子类化的新的首选方法。我遇到的麻烦是当我试图关闭我创建的一组线程时。我经常收到“线程仍在运行时已被销毁”消息(如果我在
我已经创建了这个继承自QThread的类,用于向数据库服务器发送数据,你觉得怎么样?可以改进吗? 谢谢 #ifndef QUERYTHREAD_H#define QUERYTHREAD_H#inclu
我需要在一个线程中进行无限循环。 在 this article作者写道 >you should never ever block the event loop 因为它会阻塞信号槽概念。如何在 QTh
我试图在一个单独的线程中执行一些工作,并在工作完成后停止该线程。 我已经建立了这样的连接 thread.connect( workerClass, SIGNAL( finished() ), SLOT
我有一个快速的问题。我应该创建一个小的多线程程序来从多个传感器获取数据,并且我了解 pthreads 和 qthreads。我可以访问两个图书馆。我个人偏向于使用 Qt,因为它的设计和各种功能。但是,
我需要在主线程上运行 QThread::usleep() (出于各种原因)。 但是,usleep 是受静电保护的。 我想在没有包装器的情况下使用 QThread 的 usleep 函数(我目前正在使用
我是一名优秀的程序员,十分优秀!