针对一运行就时间长,有延时的方法就卡死问题,可以用进程、线程、进程池多种办法来解决,让界面进程和时间长有延时的进程分开运行,就可以避免运行时界面卡死的问题
下面是我写的demo,供参考
# -*- coding: utf-8 -*-
"""
Module implementing MainWindow.
"""
from PyQt4.QtGui import QMainWindow
from PyQt4.QtCore import pyqtSignature,pyqtSlot
from PyQt4 import QtGui,QtCore
from Ui_test4 import Ui_MainWindow
import databases2
import random
import TestRecord
from multiprocessing import Process,Pool
import time
class work(Process): #process
def __init__(self,num):
Process.__init__(self)
self.num = num
def run(self):
clock = 0
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
if self.num == 1:
print "time waste 1 stop"
else :
print "time waste 2 stop"
def waste_time(num):
clock = 0
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
time.sleep(2)
clock += 2
print "%d time waste! "%clock
if num == 1:
print "time waste 1 stop"
else :
print "time waste 2 stop"
class info_lcd():
lcd_number = 0.0
class MainWindow(QMainWindow, Ui_MainWindow):
"""
Class documentation goes here.
"""
def __init__(self, parent = None):
"""
Constructor
"""
QMainWindow.__init__(self, parent)
self.setupUi(self)
info_lcd.lcd_number = 0
@pyqtSignature("")
def Read_data(self):
ramdom_number = random.uniform(0,20)
self.lcdNumber.display(ramdom_number)
info_lcd.lcd_number = self.lcdNumber.value()
self.test_record = TestRecord.InfoHandle()
self.test_record.AddCurrentInfoToSystemData(info_lcd)
@pyqtSlot()
def on_pushButton_clicked(self): #get the data
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
self.daq = Process(target = self.Read_data())
@pyqtSlot()
def on_pushButton_2_clicked(self):
"""
Slot documentation goes here
"""
# TODO: not implemented yet
number = self.lcdNumber.value()
self.textEdit_2.setText(str(number))
"""
Use single process to run Procedure
"""
self.run_use_single_process()
"""
Use Process to run Procedure
"""
# self.run_use_multiprocess()
"""
Use Pool to Run Procedure
"""
# self.run_use_pool()
@pyqtSlot()
def on_pushButton_3_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
self.database=databases2.Main()
self.database.show()
@pyqtSlot()
def run_use_single_process(self):
start = time.time()
waste_time(1)
waste_time(2)
end = time.time()
print 'Task Frank runs %0.2f seconds.' %(end - start)
def run_use_multiprocess(self):
start = time.time()
self.work1 = work(1)
self.work2 = work(2)
self.work1.start()
self.work2.start()
end = time.time()
print 'Task Frank runs %0.2f seconds.' %(end - start)
def run_use_pool(self):
start = time.time()
pool = Pool(processes = 3)
pool.apply_async(waste_time,(1,))
pool.apply_async(waste_time,(2,))
pool.close()
end = time.time()
print 'Task Frank runs %0.2f seconds.' %(end - start)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())