class Worker(QObject): mySignal = pyqtSignal() def __init__(self): super().__init__() def run(self): self.mySignal.emit() class MyRunnable(QRunnable): def __init__(self, func,*param): super().__init__() self.func = func self.param = param def run(self): self.func(self.param[0][0],self.param[0][1]) class test(QWidget): def __init__(self): super().__init__() self.name = 'name' self.setWindowTitle('测试') self.initUI() def initUI(self): self.label = QLabel(self) thread = QThread() worker = Worker() worker.moveToThread(thread) worker1 = Worker() worker1.moveToThread(thread) worker2 = Worker() worker2.moveToThread(thread) threadPool = QThreadPool() task1 = MyRunnable(self.func1, (1, 2)) task2 = MyRunnable(self.func2, (2, 2)) task3 = MyRunnable(self.func3, (3, 2)) #thread.started.connect(task1) worker.mySignal.connect(task1) worker1.mySignal.connect(task2) worker2.mySignal.connect(task3) threadPool.start(worker) threadPool.start(worker1) threadPool.start(worker2) threadPool.waitForDone() def func1(self,x,y): print(x+y) def func4(): self.label.setText(str(x+y)) func4() time.sleep(1) def func2(self, x,y): print(x + y) self.label.setText(str(x + y)) time.sleep(1) def func3(self, x,y): print(x + y) self.label.setText(str(x + y)) time.sleep(1) app = QApplication(sys.argv) main = test() main.show() sys.exit(app.exec_())报警:worker.mySignal.connect(task1) TypeError: argument 1 has unexpected type 'MyRunnable'怎么解决?

时间: 2024-01-14 11:02:04 浏览: 27
在这段代码中,`worker.mySignal` 是一个信号,它发出的信号将会触发 `task1` 的运行。但是你在连接信号和槽时,使用了错误的语法。正确的语法是将信号连接到槽,而你却在将信号连接到了 `MyRunnable` 对象。为了解决这个问题,你需要将 `worker.mySignal` 连接到 `task1.run` 方法。修改代码如下: ``` worker.mySignal.connect(task1.run) worker1.mySignal.connect(task2.run) worker2.mySignal.connect(task3.run) ``` 这样就可以将信号和槽正确地连接起来了。
相关问题

import threading import queue import numpy as np import pandas as pd import sqlite3 class Task: def __init__(self, task_id, task_type, data): self.task_id = task_id self.task_type = task_type self.data = data def run(self): if self.task_type == 'analysis': result = self.analysis() elif self.task_type == 'calculation': result = self.calculation() else: raise ValueError('Invalid task type') return result def analysis(self): # data analysis return ... def calculation(self): # data calculation return ... class ThreadPool: def __init__(self, max_workers): self.max_workers = max_workers self.tasks = queue.Queue() self.results = {} def submit(self, task): self.tasks.put(task) def start(self): workers = [threading.Thread(target=self.worker) for _ in range(self.max_workers)] for worker in workers: worker.start() for worker in workers: worker.join() def worker(self): while True: try: task = self.tasks.get(block=False) except queue.Empty: break result = task.run() self.results[task.task_id] = result def get_result(self, task_id): return self.results.get(task_id, None)解析

这段代码实现了一个线程池,包含了两个类:Task 和 ThreadPool。 Task 类表示一个任务,包含了任务的 ID、类型和数据。其中,类型有两种,分别为 'analysis' 和 'calculation'。Task 类有一个 run 方法,用来执行任务,根据不同的类型调用不同的方法进行数据分析或计算,并返回结果。 ThreadPool 类表示一个线程池,包含了最大工作线程数、任务队列和结果字典。其中,任务队列用来存储待执行的任务,结果字典用来存储已执行任务的结果。ThreadPool 类有三个方法: - submit 方法用来提交任务,将待执行的任务放入任务队列中。 - start 方法用来启动线程池,创建最大工作线程数个线程,并将它们启动,然后等待所有线程执行完毕。 - worker 方法是一个工作线程,它从任务队列中获取任务并执行,将执行结果存入结果字典中。 最后,ThreadPool 类还提供了一个 get_result 方法,用来获取指定任务的执行结果。如果该任务还未执行或已执行但没有返回结果,则返回 None。

这个线程建的有问题吗 class Worker(QtCore.QThread): sinOut = pyqtSignal(object) def __init__(self, parent=None): super(Worker, self).__init__(parent) # 设置工作状态与初始num数值 self.working = True self.num = 0 #def __del__(self): # 线程状态改变与线程终止 #self.working = False #self.wait() def stop(self): #线程状态改变与线程终止 self.working = False self.wait() def run(self): self.working = True while self.working == True: #file_str = 'File index{0}'.format(self.num) self.num += 1 # 发射信号 #self.sinOut.emit(file_str) self.sinOut.emit('1') # 线程休眠2秒 self.sleep(5)

这个线程看起来没有明显的问题,但是需要注意以下几点: 1. `sinOut` 信号的参数类型是 `object`,这样会使得信号的参数类型不明确,建议根据实际情况设置参数类型。 2. 在 `stop()` 方法中,需要等待线程结束后再返回,因此应该调用 `self.wait()` 方法。 3. 在 `run()` 方法中,应该将 `self.working = True` 放在 `while` 循环的外面,否则当 `working` 的值为 `False` 时,线程不会结束。 4. 在 `run()` 方法中,可以考虑使用 `QThread.msleep()` 方法代替 `time.sleep()` 方法,因为前者是线程安全的。 5. 在 `run()` 方法中,可以考虑增加一个条件判断,当 `working` 的值为 `False` 时,跳出循环以结束线程。 最终代码如下: ``` class Worker(QtCore.QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) self.working = True self.num = 0 def stop(self): self.working = False self.wait() def run(self): while self.working: self.num += 1 self.sinOut.emit('1') self.msleep(5000) if not self.working: break ```

相关推荐

这段代码没进 thing1()的原因 class Worker(QtCore.QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) # 设置工作状态与初始num数值 self.working = True self.num = 0 #def __del__(self): # 线程状态改变与线程终止 #self.working = False #self.wait() def stop(self): #线程状态改变与线程终止 self.working = False self.wait() def run(self): self.working = True while self.working == True: #file_str = 'File index{0}'.format(self.num) self.num += 1 # 发射信号 #self.sinOut.emit(file_str) self.sinOut.emit('1') # 线程休眠2秒 self.msleep(5) class parentWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_ui = JQ.Ui_MainWindow() self.main_ui.setupUi(self) self.thread1 = Worker() self.main_ui.pushButton_2.clicked.connect(self.thing1) self.thread1.sinOut.connect(self.printt) def thing1(self): #self.main_ui.pushButton.setEnabled(False) print('9999999999') self.thread1.start() self.thread1.wait() print('123') #self.sleep(2) def printt(self): print('7777') def ok(): print('ok') # def hourstest(): # thread1 = Worker() # thread1.start() # com = JQ.Ui_MainWindow().comboBox_2.currentText() # ser = serial.Serial('com3', 1200, timeout=1) # data = bytes.fromhex( # '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ') # ser.write(data) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QMainWindow() widget = parentWindow() ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦 ui.setupUi(widget) ui.discoverSerial() #串口发现 #ui.pushButton_2.clicked.connect(widget.thing1) widget.show() sys.exit(app.exec_())

self.main_ui.pushButton_2.clicked.connect(self.thing1) 没反应是为什么 class Worker(QtCore.QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) # 设置工作状态与初始num数值 self.working = True self.num = 0 #def __del__(self): # 线程状态改变与线程终止 #self.working = False #self.wait() def stop(self): #线程状态改变与线程终止 self.working = False self.wait() def run(self): self.working = True while self.working == True: #file_str = 'File index{0}'.format(self.num) self.num += 1 # 发射信号 #self.sinOut.emit(file_str) self.sinOut.emit('1') # 线程休眠2秒 self.msleep(5) class parentWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_ui = JQ.Ui_MainWindow() self.main_ui.setupUi(self) self.thread1 = Worker() self.main_ui.pushButton_2.clicked.connect(self.thing1) self.thread1.sinOut.connect(self.printt) def thing1(self): #self.main_ui.pushButton.setEnabled(False) print('9999999999') self.thread1.start() print('123') #self.sleep(2) def printt(self): print('7777') def ok(): print('ok') # def hourstest(): # thread1 = Worker() # thread1.start() # com = JQ.Ui_MainWindow().comboBox_2.currentText() # ser = serial.Serial('com3', 1200, timeout=1) # data = bytes.fromhex( # '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ') # ser.write(data) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QMainWindow() widget = parentWindow() ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦 ui.setupUi(widget) ui.discoverSerial() #串口发现 #ui.pushButton_2.clicked.connect(widget.thing1) widget.show() sys.exit(app.exec_())

这段代码的pushButton_2 为什么触发不了线程 class Worker(QtCore.QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) # 设置工作状态与初始num数值 self.working = True self.num = 0 #def __del__(self): # 线程状态改变与线程终止 #self.working = False #self.wait() def stop(self): #线程状态改变与线程终止 self.working = False self.wait() def run(self): self.working = True while self.working == True: #file_str = 'File index{0}'.format(self.num) self.num += 1 # 发射信号 #self.sinOut.emit(file_str) self.sinOut.emit('1') # 线程休眠2秒 self.msleep(5) class parentWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_ui = JQ.Ui_MainWindow() self.main_ui.setupUi(self) self.thread1 = Worker() self.main_ui.pushButton_2.clicked.connect(self.thing1) self.thread1.sinOut.connect(self.printt) def thing1(self): #self.main_ui.pushButton.setEnabled(False) print('9999999999') self.thread1.start() print('123') #self.sleep(2) def printt(self): print('7777') def ok(): print('ok') # def hourstest(): # thread1 = Worker() # thread1.start() # com = JQ.Ui_MainWindow().comboBox_2.currentText() # ser = serial.Serial('com3', 1200, timeout=1) # data = bytes.fromhex( # '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ') # ser.write(data) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QMainWindow() widget = parentWindow() ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦 ui.setupUi(widget) ui.discoverSerial() #串口发现 #ui.pushButton_2.clicked.connect(widget.thing1) widget.show() sys.exit(app.exec_())

class DistributedSampler(_DistributedSampler): def __init__(self, dataset, num_replicas=None, rank=None, shuffle=True): super().__init__(dataset, num_replicas=num_replicas, rank=rank) self.shuffle = shuffle def __iter__(self): if self.shuffle: g = torch.Generator() g.manual_seed(self.epoch) indices = torch.randperm(len(self.dataset), generator=g).tolist() else: indices = torch.arange(len(self.dataset)).tolist() indices += indices[:(self.total_size - len(indices))] assert len(indices) == self.total_size indices = indices[self.rank:self.total_size:self.num_replicas] assert len(indices) == self.num_samples return iter(indices) def build_dataloader(dataset_cfg, class_names, batch_size, dist, root_path=None, workers=4, seed=None, logger=None, training=True, merge_all_iters_to_one_epoch=False, total_epochs=0): dataset = __all__[dataset_cfg.DATASET]( dataset_cfg=dataset_cfg, class_names=class_names, root_path=root_path, training=training, logger=logger, ) if merge_all_iters_to_one_epoch: assert hasattr(dataset, 'merge_all_iters_to_one_epoch') dataset.merge_all_iters_to_one_epoch(merge=True, epochs=total_epochs) if dist: if training: sampler = torch.utils.data.distributed.DistributedSampler(dataset) else: rank, world_size = common_utils.get_dist_info() sampler = DistributedSampler(dataset, world_size, rank, shuffle=False) else: sampler = None dataloader = DataLoader( dataset, batch_size=batch_size, pin_memory=True, num_workers=workers, shuffle=(sampler is None) and training, collate_fn=dataset.collate_batch, drop_last=False, sampler=sampler, timeout=0, worker_init_fn=partial(common_utils.worker_init_fn, seed=seed) ) return dataset, dataloader, sampler

class Worker(QObject): mySignal = pyqtSignal() def init(self): super().init() def run(self): self.mySignal.emit() class MyRunnable(QRunnable): def init(self, func,*param): super().init() self.func = func self.param = param def run(self): self.func(self.param[0][0],self.param[0][1]) class test(QWidget): def init(self): super().init() self.name = 'name' self.setWindowTitle('测试') self.initUI() def initUI(self): self.label = QLabel(self) thread = QThread() worker = Worker() worker.moveToThread(thread) worker1 = Worker() worker1.moveToThread(thread) worker2 = Worker() worker2.moveToThread(thread) threadPool = QThreadPool() task1 = MyRunnable(self.func1, (1, 2)) task2 = MyRunnable(self.func2, (2, 2)) task3 = MyRunnable(self.func3, (3, 2)) #thread.started.connect(task1) worker.mySignal.connect(task1.run) worker1.mySignal.connect(task2.run) worker2.mySignal.connect(task3.run) threadPool.start(worker) threadPool.start(worker1) threadPool.start(worker2) threadPool.waitForDone() def func1(self,x,y): print(x+y) def func4(): self.label.setText(str(x+y)) func4() time.sleep(1) def func2(self, x,y): print(x + y) self.label.setText(str(x + y)) time.sleep(1) def func3(self, x,y): print(x + y) self.label.setText(str(x + y)) time.sleep(1) app = QApplication(sys.argv) main = test() main.show() sys.exit(app.exec_())报警:TypeError: arguments did not match any overloaded call: start(self, QRunnable, priority: int = 0): argument 1 has unexpected type 'Worker' start(self, Callable[[], None], priority: int = 0): argument 1 has unexpected type 'Worker'怎么解决?

最新推荐

recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性

![MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性](https://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB结构体与数据库交互:无缝连接数据存储与处理,实现数据管理自动化

![MATLAB结构体与数据库交互:无缝连接数据存储与处理,实现数据管理自动化](https://ww2.mathworks.cn/products/database/_jcr_content/mainParsys/band_1749659463_copy/mainParsys/columns_copy/6d5289a2-72ce-42a8-a475-d130cbebee2e/image_copy_2009912310.adapt.full.medium.jpg/1709291769739.jpg) # 1. MATLAB结构体与数据库交互概述** MATLAB结构体与数据库交互是一种强大的
recommend-type

Link your Unity

project to C# script in Visual Studio. Can you provide me with some guidance on this? Yes, I can definitely help you with that! To link your Unity project to C# script in Visual Studio, you first need to make sure that you have both Unity and Visual Studio installed on your computer. Then, you can
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。
recommend-type

关系数据表示学习

关系数据卢多维奇·多斯桑托斯引用此版本:卢多维奇·多斯桑托斯。关系数据的表示学习机器学习[cs.LG]。皮埃尔和玛丽·居里大学-巴黎第六大学,2017年。英语。NNT:2017PA066480。电话:01803188HAL ID:电话:01803188https://theses.hal.science/tel-01803188提交日期:2018年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaireUNIVERSITY PIERRE和 MARIE CURIE计算机科学、电信和电子学博士学院(巴黎)巴黎6号计算机科学实验室D八角形T HESIS关系数据表示学习作者:Ludovic DOS SAntos主管:Patrick GALLINARI联合主管:本杰明·P·伊沃瓦斯基为满足计算机科学博士学位的要求而提交的论文评审团成员:先生蒂埃里·A·退休记者先生尤尼斯·B·恩