#! /usr/bin/env python #coding=utf-8 import threading
from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QProgressBar import sys import time
class myThread (threading.Thread): ? ? def __init__(self, threadID, name, counter): ? ? ? ? threading.Thread.__init__(self) ? ? ? ? self.threadID = threadID ? ? ? ? self.name = name ? ? ? ? self.counter = counter ? ? def run(self): ? ? ? ? print ("开始线程:" + self.name) ? ? ? ? tasks = [] ? ? ? ? for counter in range(1,101): ? ? ? ? ? ? task=Tasks(counter) ? ? ? ? ? ? task.start() ? ? ? ? ? ? tasks.append(task) ? ? ? ? for t in tasks: ? ? ? ? ? ? t.notify() ? ? ? ? ? ? time.sleep(0.05) ? ? ? ? Tasks.wait() ? ? ? ? print ("退出线程:" + self.name)
class Thread(QtCore.QRunnable): ? ?? ? ? def __init__(self,num): ? ? ? ?super(Thread,self).__init__() ? ? ? ?self.num=num ? ? def run(self): ? ? ? ?print("Running Thread #%d" % self.num) ? ? ? ?#time.sleep(2) ?? ? ? #some say time.sleep will froze entire main thread(thus not recommended)
? ? ? QtCore.QThread.msleep(80) ? ? ? ? #自定义信号槽如何把持http://www.cnblogs.com/codeio/archive/2011/08/30/2159030.html class Tasks(QtCore.QObject): ? ?? ? ? signal=QtCore.pyqtSignal(int) ? ? #signal must be declared outside the constructor but within class. ? ? def __init__(self,num): ? ? ? ?super(Tasks,self).__init__() ? ? ? ?self.pool=QtCore.QThreadPool.globalInstance() ? ? ? ?self.num=num ? ? ? ?self.signal.connect(proBar.setValue) ? ? ? ?#signal slot connection.watch out for parameter matching(type & count). ? ? ? ?? ? ? def start(self): ? ? ? ?threadIns=Thread(self.num) ? ? ? ?self.pool.start(threadIns) ? ?? ? ? def notify(self): ? ? ? ? self.signal.emit(self.num) ? ?? ? ? @staticmethod ? ? def wait(): ? ? ? ?QtCore.QThreadPool.globalInstance().waitForDone() ? ? ? ?
? ? ? ? if __name__=="__main__": ? ?App=QApplication(sys.argv) ? ?print(QtCore.QThread.currentThreadId()) ? ?? ? ?proBar=QProgressBar() ? ?proBar.setWindowTitle("Nuclear Launch Progression") ? ?proBar.setValue(0) ? ?proBar.setGeometry(200,500,1000,30) ? ?proBar.show()
? ?# 这里在子线程里异步启动QThreadPool,并等待线程池结束,如果不异步启动的话会阻塞ui主线程 ? ?th = myThread(1, 'thread-1', 1) ? ?th.start() ? ?sys.exit(App.exec_())
|