- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我想学习使用moveToThread并查看从另一个线程(在本例中为主线程)调用onTimeout()
类的GenericWorker
的效果。奇怪的是,finish_sig
中的GenericWorker
从未发出(应该在onTimeout()
的最后一行发生)。由于它连接到terminate_thread()
类中的Sender
,因此至少应在控制台中打印出terminate_thread
,但什么也没有发生。
我使用它的最初目的是在onTimeout()
完成后发出退出线程的信号。但是现在我只能从main
执行t.quit()退出线程。
谢谢大家花时间解决我的问题!
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import threading
from time import sleep
import sys
class GenericWorker(QObject):
finish_sig = pyqtSignal() # this one never gets emitted!
@pyqtSlot(str, str)
def onTimeout(self, cmd1, cmd2):
print 'onTimeout get called from thread ID: '
print QThread.currentThreadId()
print 'received cmd 1: ' + cmd1
print 'received cmd 2: ' + cmd2
self.finish_sig.emit() # supposed to emit here!
class Sender(QObject):
send_sig = pyqtSignal(str, str)
terminate_sig = pyqtSignal()
def emit_sig(self, cmd):
print 'emit_sig thread ID: '
print QThread.currentThreadId()
sleep(1)
self.send_sig.emit(cmd, '2nd_cmd')
def terminate_thread(self):
print 'terminate_thread'
self.terminate_sig.emit()
if __name__ == "__main__":
app = QApplication(sys.argv)
print 'Main thread ID: '
print QThread.currentThreadId()
t = QThread()
my_worker = GenericWorker()
my_worker.moveToThread(t)
t.start()
my_sender = Sender()
my_sender.send_sig.connect(my_worker.onTimeout)
my_sender.terminate_sig.connect(t.quit)
my_worker.finish_sig.connect(my_sender.terminate_thread)
# my_worker.finish_sig.connect(t.quit)
my_sender.emit_sig('hello')
sleep(1)
# my_sender.terminate_thread()
# t.quit() # this one works
# t.wait()
exit(1)
sys.exit(app.exec_())
Main thread ID:
46965006517856
emit_sig thread ID:
46965006517856
onTimeout get called from thread ID:
1111861568
received cmd 1: hello
received cmd 2: 2nd_cmd
QThread: Destroyed while thread is still running
exit(1)
不是退出的正确方法,我需要删除此行。 QApplication
的方法,我需要做的是添加t.finish.connect(app.quit)
退出应用程序。 (顺便说一句,最后一行sys.exit(app.exec_())
似乎没有处理QApplication
的退出问题)QThread
,
QApplication
和
sys
,我错过的是退出
QApplication
。让我知道我的理解是否正确...
最佳答案
您的问题是您在程序完成之前退出了程序。
my_sender.emit_sig('hello')
sleep(1)
exit(1)
sys.exit(app.exec_())
exit()
也会结束您的程序,因此出现错误:
QThread: Destroyed while thread is still running
sleep(1)
,您将看到该程序甚至更早停止:
Main thread ID:
46965006517856
emit_sig thread ID:
46965006517856
QThread: Destroyed while thread is still running
# main thread #worker thread
my_sender.emit_sig('hello') #slot onTimeout is called
sleep(1) #print "onTimeout get called..."
exit(1) #emit finish_sig
sys.exit(app.exec_())
# slot terminate_thread is called #thread ends (t.quit)
exit(1)
,则您的程序将运行,因为您使用
app.exec_()
创建了一个事件循环。事件循环意味着您的程序始终在等待捕获信号,即使没有任何事情要做,也不会停止。因此线程有足够的时间结束:)
class window(QWidget):
def __init__(self,parent=None):
super(window,self).__init__(parent)
t=QThread(self)
self.my_worker = GenericWorker()
self.my_worker.moveToThread(t)
t.start()
self.my_sender = Sender()
self.my_sender.send_sig.connect(self.my_worker.onTimeout)
self.my_sender.terminate_sig.connect(t.quit)
self.my_worker.finish_sig.connect(self.my_sender.terminate_thread)
self.my_sender.emit_sig('hello')
if __name__ == "__main__":
app = QApplication(sys.argv)
win=window()
win.show()
sys.exit(app.exec_())
self
来保留对线程和类的引用。否则,当
__init__
结束时,它们将被销毁。
关于multithreading - 在moveToThread之后pyqtSlot中未发出PyQt信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923393/
将对象从一个线程移动到另一个线程时,moveToThread()自动将现有的直接连接重写为排队的连接? 或者换句话说:在调用 moveToThread() 之前或之后建立自动连接是否重要? ? 不幸的
我有以下类(class): class commMonitor : QObject { Q_OBJECT public: commMonitor(); ~commMonitor
是否可以将成员函数移动到新线程而不是整个类? 将其置于上下文中: class FooBar : public QObject { Q_OBJECT // some other
如果类型为 QObject 的对象被移动到一个线程 QObject::moveToThread ,对象接收到的所有信号都在该线程内处理。但是,如果直接调用插槽( object->theSlot() )
我有这样一个类: class myClass:public QThread 然后在它的构造函数中我做了: myClass::myClass(){ moveToThread(this);
我有一个类 Manager class Manager : public QThread { Q_OBJECT public: Manager(); void run(
我有一个用于 GUI 的主线程,其中运行 MainWindow 对象,在它的构造函数中,我创建了一个新的 worker 对象和一个 QThread 对象,然后我将 worker 移动到线程,问题是当打
在 QThread class 的文档中一个示例性设置的工作原理如下: public: Controller() { Worker *worker = new Worker; work
有一个类只有一个信号槽: #ifndef SOME_CLASS_H #define SOME_CLASS_H #include class SomeClass : public QObject {
我的IDE Qt 5.0.1,平台Linux 我对将小部件设置为窗口有疑问。(我的意见) 这是我的 main.cpp-> int main(int argc, char *argv[]) {
我搜索了这个站点和 QT 文档,但找不到以下问题的直接答案: 假设我有一个只有一个插槽的 worker 类: void Worker::testSlot(){ //access data and
我在 python 中使用 opencv2 和代码 import cv2 cv2.namedWindow("output", cv2.WINDOW_NORMAL) cv2.imshow("
我正在尝试使用线程创建程序:主要从一个循环开始。当测试返回 true 时,我创建一个对象并希望该对象在另一个线程中工作然后返回并开始测试。 QCoreApplication a(argc, argv)
我尝试使用来自 https://wiki.qt.io/QThreads_general_usage 的方法与 moveToThread。一切安好。但是,如果我尝试将参数添加到完成的信号中,则会出现以下
我有这样的东西: main.cpp int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); static
我刚刚开始在 Windows 上使用 Qt 并阅读了有关 moveToThread() 函数的信息。如果我这样写可以吗: class Worker : public QObject { Q_O
我试图在 Qt 中使用线程将一些工作委托(delegate)给线程,但我无法让它工作。我有一个继承 QMainWindow 的类,它有一个启动线程来工作的成员对象。该对象以 QMainwindow 作
我们什么时候在线程应用程序中使用每个函数调用。给定在同一个类中定义的两个函数 fun1() 和 fun2() 处理将数据读/写到缓冲区(队列操作)。实现多线程就这些。我们将不得不在单独的线程中运行这两
我刚开始使用多线程,在将对象移动到 QThread 时遇到了一些麻烦。我的 Controller 类实例化了 Worker,为 Worker 创建了必要的线程并将 Worker 移动到新线程。当工作线
我正在构建一个小型多线程 Web 服务器。 QTcpSockets 在主线程中获取,然后由 QtConcurrent 移交给 QThreadPool,后者最终处理数据并发出答案。 我的问题是套接字是在
我是一名优秀的程序员,十分优秀!