当前位置: 首页 > news >正文

顺企网上海网站建设腾讯微信小程序官网

顺企网上海网站建设,腾讯微信小程序官网,wordpress 仪表盘界面,网站建设预算申请如何写文章目录 前言为什么要使用多线程 一、单个线程实现按钮方法的执行二、线程嵌套多个子线程实现按钮方法的执行三、QT GUI常用代码3.1 多线程取出队列任务循环执行#xff0c;无停止3.2 将某个方法放在线程中执行3.3 QT pyside2 tableWidget 清除日志3.4 退出整个GUI程序(杀死进… 文章目录 前言为什么要使用多线程 一、单个线程实现按钮方法的执行二、线程嵌套多个子线程实现按钮方法的执行三、QT GUI常用代码3.1 多线程取出队列任务循环执行无停止3.2 将某个方法放在线程中执行3.3 QT pyside2 tableWidget 清除日志3.4 退出整个GUI程序(杀死进程)3.5 子线程执行和子线程停止3.6 抛出异常来停止子线程的执行3.7 使用多个子线程往同一个queue队列对象中存储数据 四、资源推荐总结 前言 为什么要使用多线程 QT是一种流行的跨平台应用程序开发框架而PySide2是QT的一个Python绑定库。在QT和PySide2中使用多线程的主要原因是为了提高应用程序的性能和响应能力。 使用多线程可以将耗时的任务分配给不同的线程在后台并行执行从而避免阻塞主线程保持应用程序的流畅性和响应性。当应用程序需要进行复杂的计算、网络请求、文件读写或其他需要较长时间的操作时使用多线程可以防止这些操作对用户界面的阻塞使用户能够继续与应用程序进行交互。 需要注意的是在使用多线程时要注意线程安全性和数据同步的问题。多个线程同时访问共享的数据可能导致竞态条件和数据不一致的问题因此需要采取适当的同步机制如锁、信号量或其他线程间通信机制来保证数据的一致性和正确性。 总而言之使用多线程可以提高QT PySide2应用程序的性能、响应能力和并发性但需要注意线程安全和数据同步的问题。 提示以下是本篇文章正文内容下面案例可供参考 一、单个线程实现按钮方法的执行 实现效果界面不会卡顿、可以继续与应用程序进行交互 开始执行、停止执行思路 当点击开始按钮时分配一个线程a去循环执行按钮绑定的方法如果变量_stop_event的值为True则一直执行方法当点击停止按钮时分配一个线程b去设置变量_stop_event的值为False当线程a再次判断时则会跳出执行方法的循环具体的逻辑得分析一下MyThread类的代码 import sys from PySide2.QtWidgets import QApplication, QWidget, QTableWidgetItem from PySide2.QtUiTools import loadUiType, QUiLoader from PySide2.QtCore import QFile, Qt from PySide2.QtGui import QIcon import time import threadingclass MyThread(threading.Thread):def __init__(self, qt):super().__init__()self.qtGui qtself._stop_event threading.Event()def stop(self):self._stop_event.set()def run(self):message_list [f第{k}次打印 for k in range(100)]log_content {one: - * 20, two: - * 20, three: - * 20, four: - * 20}for message in message_list:if self._stop_event.is_set() is True:breaklog_content[five] messageself.qtGui.logger_show(log_content)time.sleep(0.1)log_content[five] 答题子线程已停止运行请进行下一步操作time.sleep(5)[self.qtGui.logger_show(log_content) for kk in range(1)]return Trueclass Gui(QWidget):def __init__(self):# 加载ui文件创建qt文件对象加载文件对象并创建ui对象QtFileObj QFile(yk.ui)QtFileObj.open(QFile.ReadOnly)QtFileObj.close()self.ui QUiLoader().load(QtFileObj)# 设置界面图标icon QIcon(yk.ico)self.ui.setWindowIcon(icon)# 变量、对象定义self.index 0self.ui.tableWidgetAnswer.horizontalHeader().setVisible(True) # 设置tableWidget组件的标题显示为Trueself.ui.startButton.clicked.connect(self.start_running) # 绑定按钮的方法self.ui.stopButton.clicked.connect(self.stop_running)self.answer_thread None # 答题启动线程对象def start_running(self):# 插入内容logger_item {one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: 程序已经开始运行请勿多次点击开始运行按钮}[self.logger_show(logger_item) for kk in range(1)]# 创建线程对象self.answer_thread MyThread(self) # 传入qt对象# 启动线程self.answer_thread.start()def stop_running(self):# 停止线程self.answer_thread.stop()logger_item {one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: 答题程序已设置停止线程请等待最后一个账号运行完再进行下一步操作}[self.logger_show(logger_item) for kk in range(1)]def logger_show(self, logger_item):self.ui.tableWidgetAnswer.insertRow(int(self.ui.tableWidgetAnswer.rowCount()))self.index 1new_item_one QTableWidgetItem(logger_item[one])new_item_one.setTextAlignment(Qt.AlignCenter)new_item_two QTableWidgetItem(logger_item[two])new_item_two.setTextAlignment(Qt.AlignCenter)new_item_three QTableWidgetItem(logger_item[three])new_item_three.setTextAlignment(Qt.AlignCenter)new_item_four QTableWidgetItem(logger_item[four])new_item_four.setTextAlignment(Qt.AlignCenter)new_item_five QTableWidgetItem(logger_item[five])new_item_five.setTextAlignment(Qt.AlignCenter)self.ui.tableWidgetAnswer.setItem(self.index - 1, 0, new_item_one)self.ui.tableWidgetAnswer.setItem(self.index - 1, 1, new_item_two)self.ui.tableWidgetAnswer.setItem(self.index - 1, 2, new_item_three)self.ui.tableWidgetAnswer.setItem(self.index - 1, 3, new_item_four)self.ui.tableWidgetAnswer.setItem(self.index - 1, 4, new_item_five)# 定位至最新行self.ui.tableWidgetAnswer.verticalScrollBar().setSliderPosition(self.index)# 刷新QApplication.processEvents()if __name__ __main__:app QApplication(sys.argv)ykGuiObj Gui()ykGuiObj.ui.show()sys.exit(app.exec_()) 二、线程嵌套多个子线程实现按钮方法的执行 实现效果界面不会卡顿、可以继续与应用程序进行交互多个子线程同时执行或停止 开始执行、停止执行思路 当点击开始按钮时分配一个线程a去开启5个子线程去执行打印日志的方法当点击停止按钮时分配一个线程b去设置变量_stop_event的值为True当线程a再次判断时则会跳出执行方法的循环具体的逻辑得分析一下MyThread类的代码可分析运行效果图标红处同时开了5个子线程去打印并实现了停止子线程的执行 import sys import time import random from PySide2.QtWidgets import QApplication, QWidget, QTableWidgetItem from PySide2.QtUiTools import loadUiType, QUiLoader from PySide2.QtCore import QFile, Qt from PySide2.QtGui import QIcon import threading import concurrent.futures from queue import Queueclass MyThread(threading.Thread):def __init__(self, qt):super().__init__()self.qtGui qtself.executor None # 创建线程池self._stop_event threading.Event()def stop(self):self._stop_event.set()def run(self):log_content {one: - * 20, two: - * 20, three: - * 20, four: - * 20}message_queue self.build_log_messages()thread_number 5 # 线程数while message_queue.qsize():if self.executor is None or self.executor._shutdown:# 创建线程池self.executor concurrent.futures.ThreadPoolExecutor()for kkk in range(thread_number): # 开启4子线程执行打印方法self.executor.submit(self.qtGui.logger_show, message_queue.get(), random.randint(1, 15) * 0.1)time.sleep(0.2)self.executor.shutdown(waitTrue) # 等待任务执行完成if self._stop_event.is_set() is True: # 当停止按钮被点击后则会进入这个跳出循环条件breaklog_content[five] 答题子线程已停止运行请进行下一步操作time.sleep(5)[self.qtGui.logger_show(log_content) for kk in range(1)]return Truedef build_log_messages(self):message_queue Queue()grapheme_list [A, B, C, D, E, F, G, H, I, J]num 0while num 100: # 存储需要打印的日志信息for grapheme in grapheme_list:num 1message_queue.put({one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: f线程{grapheme} {grapheme * 10} 打印数字{num}})return message_queueclass Gui(QWidget):def __init__(self):# 加载ui文件创建qt文件对象加载文件对象并创建ui对象QtFileObj QFile(yk.ui)QtFileObj.open(QFile.ReadOnly)QtFileObj.close()self.ui QUiLoader().load(QtFileObj)# 设置界面图标icon QIcon(yk.ico)self.ui.setWindowIcon(icon)# 变量、对象定义self.index 0self.ui.tableWidgetAnswer.horizontalHeader().setVisible(True) # 设置tableWidget组件的标题显示为Trueself.ui.startButton.clicked.connect(self.start_running) # 绑定按钮的方法self.ui.stopButton.clicked.connect(self.stop_running)self.answer_thread None # 答题启动线程对象def start_running(self):# 插入内容logger_item {one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: 程序已经开始运行请勿多次点击开始运行按钮}[self.logger_show(logger_item) for kk in range(1)]# 创建线程对象self.answer_thread MyThread(self) # 传入qt对象# 启动线程self.answer_thread.start()def stop_running(self):# 停止线程self.answer_thread.stop()logger_item {one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: 答题程序已设置停止线程请等待最后一个账号运行完再进行下一步操作}[self.logger_show(logger_item) for kk in range(1)]def logger_show(self, logger_item, sleep0):time.sleep(sleep)self.ui.tableWidgetAnswer.insertRow(int(self.ui.tableWidgetAnswer.rowCount()))self.index 1new_item_one QTableWidgetItem(logger_item[one])new_item_one.setTextAlignment(Qt.AlignCenter)new_item_two QTableWidgetItem(logger_item[two])new_item_two.setTextAlignment(Qt.AlignCenter)new_item_three QTableWidgetItem(logger_item[three])new_item_three.setTextAlignment(Qt.AlignCenter)new_item_four QTableWidgetItem(logger_item[four])new_item_four.setTextAlignment(Qt.AlignCenter)new_item_five QTableWidgetItem(logger_item[five])new_item_five.setTextAlignment(Qt.AlignCenter)self.ui.tableWidgetAnswer.setItem(self.index - 1, 0, new_item_one)self.ui.tableWidgetAnswer.setItem(self.index - 1, 1, new_item_two)self.ui.tableWidgetAnswer.setItem(self.index - 1, 2, new_item_three)self.ui.tableWidgetAnswer.setItem(self.index - 1, 3, new_item_four)self.ui.tableWidgetAnswer.setItem(self.index - 1, 4, new_item_five)# 定位至最新行self.ui.tableWidgetAnswer.verticalScrollBar().setSliderPosition(self.index)# 刷新QApplication.processEvents()if __name__ __main__:app QApplication(sys.argv)ykGuiObj Gui()ykGuiObj.ui.show()sys.exit(app.exec_())三、QT GUI常用代码 3.1 多线程取出队列任务循环执行无停止 import time import threading from queue import Queuedef task_running(param1, param2):while True:task_info task_queue.get() # 取出任务time.sleep(1)print(task_info)task_queue.task_done() # 全部完成则退出死循环def thread_controller(task_queue):thread_number 3 # 线程数for j in range(thread_number):t threading.Thread(targettask_running, args(1, 2))t.daemon True # 设置线程daemon 主线程退出就直接让子线程跟随退出t.start()if __name__ __main__:task_queue Queue()thread_controller(task_queue)3.2 将某个方法放在线程中执行 # 调用示例 StartButton.clicked.connect(lambda: self.thread_it(self.function, param))def thread_it(self, func, *args):将函数打包进线程self.myThread threading.Thread(targetfunc, argsargs)self.myThread.setDaemon(True)self.myThread.start()3.3 QT pyside2 tableWidget 清除日志 def clear_logger(self, route_nameNone):for i in range(self.index):self.tableWidget .removeRow(0) # 删除tableWidget组件的第0行数据# self.ui.tableWidget.clearContents() # 清除/删除所有内容time.sleep(1)self.index 03.4 退出整个GUI程序(杀死进程) def exit_program(self, route_name):tmp os.popen(tasklist).readlines()for tm in tmp:if python not in tmcontinuetime.sleep(0.5)pid tm.strip().replace( , ).split(.exe)[-1].split(Console)[0]subprocess.Popen(taskkill /F /T /PID str(pid), shellTrue)return True3.5 子线程执行和子线程停止 import threadingclass MyThread(threading.Thread):def __init__(self, qt):super().__init__()self._stop_event threading.Event()def stop(self):self._stop_event.set()def run(self):while True:print(开始运行)if self._stop_event.is_set() is True: # 当停止按钮被点击后则会进入这个跳出循环条件break3.6 抛出异常来停止子线程的执行 import ctypes import threadingclass ThreadWithException(threading.Thread):def __init__(self, _tk, route_number0):threading.Thread.__init__(self)self._tk _tkself.route_number route_numberdef run(self):passdef get_id(self):if hasattr(self, _thread_id):return self._thread_idfor id, thread in threading._active.items():if thread is self:return iddef raise_exception(self):thread_id self.get_id()# 精髓就是这句话给线程发过去一个exceptions线程就那边响应完就停了response ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))if response 1:ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)3.7 使用多个子线程往同一个queue队列对象中存储数据 逻辑解释 queue模块提供了线程安全的队列类Queue可以安全地在多个线程之间进行数据存储和获取操作在主进程中创建一个queue对象调用方法开启多子线程时将queue对象作为参数传入;多个子线程可以通过queue对象进行数据存储并且不会发生数据冲突的情况主进程也可开启一个子线程去实时监听queue对象中是否有新的数据存入如果有则进行处理下面我分了两个源码文件进行演示一个是gui.py主要写的是qt代码另一个是data_save.py主要是进行数据存储的代码 gui.py import sys import time import random from PySide2.QtWidgets import QApplication, QWidget, QTableWidgetItem from PySide2.QtUiTools import loadUiType, QUiLoader from PySide2.QtCore import QFile, Qt from PySide2.QtGui import QIcon import threading import concurrent.futures from queue import Queue from data_save import DataSaveclass MyThread(threading.Thread):def __init__(self, qt):super().__init__()self.qtGui qtself.executor None # 创建线程池self._stop_event threading.Event()def stop(self):self._stop_event.set()def run(self):task_queue Queue()log_content {one: - * 20, two: - * 20, three: - * 20, four: - * 20}message_queue self.build_log_messages()thread_number 5 # 线程数while message_queue.qsize():if self.executor is None or self.executor._shutdown:# 创建线程池self.executor concurrent.futures.ThreadPoolExecutor()for kkk in range(thread_number): # 开启5子线程执行打印方法data_sava_pipeline DataSave()self.executor.submit(data_sava_pipeline.runs, self.qtGui, task_queue, message_queue.get())time.sleep(0.2)self.executor.shutdown(waitTrue) # 等待任务执行完成if self._stop_event.is_set() is True: # 当停止按钮被点击后则会进入这个跳出循环条件breaklog_content[five] 答题子线程已停止运行请进行下一步操作print(task_queue, task_queue.qsize(), task_queue.queue)time.sleep(2)[self.qtGui.logger_show(log_content) for kk in range(1)]return Truedef build_log_messages(self):message_queue Queue()grapheme_list [A, B, C, D, E, F, G, H, I, J]num 0while num 100: # 存储需要打印的日志信息for grapheme in grapheme_list:num 1message_queue.put({one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: f线程{grapheme} {grapheme * 10} 打印数字{num}})return message_queueclass Gui(QWidget):def __init__(self):# 加载ui文件创建qt文件对象加载文件对象并创建ui对象QtFileObj QFile(D:\MyStudy\MyProject\PythonProject\python_example\项目接单学习/18_PYQT\可视化编程\yk.ui)QtFileObj.open(QFile.ReadOnly)QtFileObj.close()self.ui QUiLoader().load(QtFileObj)# 设置界面图标icon QIcon(yk.ico)self.ui.setWindowIcon(icon)# 变量、对象定义self.index 0self.ui.tableWidgetAnswer.horizontalHeader().setVisible(True) # 设置tableWidget组件的标题显示为Trueself.ui.startButton.clicked.connect(self.start_running) # 绑定按钮的方法self.ui.stopButton.clicked.connect(self.stop_running)self.answer_thread None # 答题启动线程对象def start_running(self):# 插入内容logger_item {one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: 程序已经开始运行请勿多次点击开始运行按钮}[self.logger_show(logger_item) for kk in range(1)]# 创建线程对象self.answer_thread MyThread(self) # 传入qt对象# 启动线程self.answer_thread.start()def stop_running(self):# 停止线程self.answer_thread.stop()logger_item {one: - * 20, two: - * 20, three: - * 20, four: - * 20,five: 答题程序已设置停止线程请等待最后一个账号运行完再进行下一步操作}[self.logger_show(logger_item) for kk in range(1)]def logger_show(self, logger_item, sleep0):time.sleep(sleep)self.ui.tableWidgetAnswer.insertRow(int(self.ui.tableWidgetAnswer.rowCount()))self.index 1new_item_one QTableWidgetItem(logger_item[one])new_item_one.setTextAlignment(Qt.AlignCenter)new_item_two QTableWidgetItem(logger_item[two])new_item_two.setTextAlignment(Qt.AlignCenter)new_item_three QTableWidgetItem(logger_item[three])new_item_three.setTextAlignment(Qt.AlignCenter)new_item_four QTableWidgetItem(logger_item[four])new_item_four.setTextAlignment(Qt.AlignCenter)new_item_five QTableWidgetItem(logger_item[five])new_item_five.setTextAlignment(Qt.AlignCenter)self.ui.tableWidgetAnswer.setItem(self.index - 1, 0, new_item_one)self.ui.tableWidgetAnswer.setItem(self.index - 1, 1, new_item_two)self.ui.tableWidgetAnswer.setItem(self.index - 1, 2, new_item_three)self.ui.tableWidgetAnswer.setItem(self.index - 1, 3, new_item_four)self.ui.tableWidgetAnswer.setItem(self.index - 1, 4, new_item_five)# 定位至最新行self.ui.tableWidgetAnswer.verticalScrollBar().setSliderPosition(self.index)# 刷新QApplication.processEvents()if __name__ __main__:app QApplication(sys.argv)ykGuiObj Gui()ykGuiObj.ui.show()sys.exit(app.exec_())data_save.py import time import randomclass DataSave(object):def __init__(self):passdef data_save(self, items):message items[message]items[queue].put(message)items[qt].logger_show(message)def runs(self, qt, queue, message):sleep random.randint(2, 10) * 0.1time.sleep(sleep)print(fmessage{message} sleep{sleep}\n, end)items {qt: qt, queue: queue, message: message}self.data_save(items)四、资源推荐 1、QT Pyside2 Designer 的基本使用https://blog.csdn.net/EXIxiaozhou/article/details/131401574 2、入门文档请看白月黑羽https://www.byhy.net/tut/py/gui/qt_01 3、入门视频请看白月黑羽https://www.bilibili.com/video/BV19A411H7dS/ 4、深入学习博主推荐-国内站点https://gitee.com/feiyangqingyun 5、深入学习博主推荐-国际站点https://github.com/feiyangqingyun 6、CSDN个人主页https://blog.csdn.net/feiyangqingyun 7、官网https://www.pythonguis.com/topics/pyside2/ 总结 这篇博文的示例主要以实现功能为目的我自己觉得有地方不太合适欢迎大佬和小伙伴在评论处积极提出
http://www.w-s-a.com/news/393213/

相关文章:

  • 扬州公司做网站徐州网站建设优化
  • 手机网站弹出层插件有哪些wordpress 文章标签
  • 网站建设详细合同范本长沙注册公司流程与费用
  • 搜索引擎网站录入wordpress怎么修改导航
  • 业务接单网站重庆网站制
  • 绿色农产品网站景区网站建设策划方案
  • 服务器做ssr后还可以做网站吗品牌形象设计公司
  • 太原网站制作计划wordpress创建文章
  • 网站优化要怎么做seo网站关键词优化报价
  • 公司网站友情链接怎么做副链华为荣耀手机官网
  • 一条龙做网站旅游网页设计模板图凡科
  • 中山网站建设哪家便宜在中国做外国网站怎么收钱
  • 网站优化大计孝感注册公司
  • 设计接单app平台有哪些在线网站seo诊断
  • 兰州网站建设推广现代营销手段有哪些
  • 郴州网站seo优化网络安全哪个培训班比较好
  • 做网站需要记哪些代码企业网站建设思路
  • 重庆自助建站模板网络服务器配置与管理
  • 外贸网站怎样做小程序买量平台
  • 中山精品网站建设机构海外留学网站建设方案
  • 长春网站建设工作如何取消wordpress页脚
  • 忻府网站建设排名网络管理系统官网
  • 张家港外贸网站建设国医堂网站平台建设
  • 水冶那里有做网站的对于网站链接优化有哪些建议
  • 宝安中心地铁站是几号线化妆品网站做的好的
  • 海宁营销型网站设计企业融资是什么意思
  • 淘宝客做网站要钱吗网站开发试题库
  • 10g空间网站做视频网站网站建设找超速云
  • 一元购网站怎么做企业网站源码cms
  • 域名不变 网站改版临沂企业网站建站模板