PythonQT界面卡死問題

針對一運行就時間長,有延時的方法就卡死問題,可以用進程、線程、進程池多種辦法來解決,讓界面進程和時間長有延時的進程分開運行,就可以避免運行時界面卡死的問題

下面是我寫的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_())
    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章