Python + PyQt架構:多線程入門示例 在大型軟件開發(fā)過程中,多線程是一種經常使用的編程技術。使用多線程技術,可以將耗時較大的代碼放到單獨的線程中處理,避免軟件界面程序的假死現象,提高軟件的運行效率。 下面兒給出一個在Python語言中使用PyQt界面庫編寫多線程程序的入門例子。 例子說明 該例運行界面中包含三個按鈕控件和一個文本框控件,如下圖所示: 點擊“創(chuàng)建新線程”按鈕,可以創(chuàng)建一個子線程,在該線程中每隔500ms產生一個自加1的數,將該數值顯示在文本框中,同時,文本框中也顯示了當前線程的序號及ID號,可多次點擊該按鈕來創(chuàng)建多個子線程。上圖文本框中顯示的是創(chuàng)建了四個子線程的情況。 點擊“停止所有線程”可以停止所有已經創(chuàng)建的子線程。 點擊“退出程序”按鈕則退出當前程序。 線程類的代碼實現 在PyQt中創(chuàng)建一個基于QThread類的線程類——MyThread,具體實現代碼如下圖所示: 對上述代碼說明如下: 第15行,定義一個信號dispSignal,其傳遞的參數類型為str字符串類型。 第16-19行,類的初始化函數,主要定義兩個成員變量number和keepRunning,分別表示當前線程的序號和當前線程是否運行的標志。其中,number在線程類的實例定義時由主線程(調用者)傳入,keepRunning初始化為True。 第21-22行,定義一個stop函數由主線程調用,在函數內部設置keepRunning的值為假,用以停止該線程的運行。 第24-31行,重寫run函數,這是PyQt線程中的主要代碼實現部分,當在主線程中調用線程類的start函數時會自動運行該函數。在該函數中,首先獲得該線程的id,然后在while循環(huán)中每隔500ms產生一個自加1的變量i(初始值為0),然后將線程的序號、id號和i的值組合成一個字符串信息通過信號dispSignal發(fā)送出去。當keepRunning的值為假時退出while循環(huán)。 因此,可在主線程中定義一個槽函數對應信號dispSigna用以處理信息的顯示。 軟件界面類的代碼實現 定義一個基于QWidget類的窗口類——MyWnd類,作為軟件運行的主界面窗口類。具體實現代碼如下圖所示: 對上述代碼說明如下: 第34-55行,類的初始化函數,定義界面的布局。其中,第53行,定義了一個列表變量allThreads,存儲所創(chuàng)建的線程。 第57-61行,點擊“創(chuàng)建新線程”按鈕時對應的槽函數,在該函數中定義一個新的線程實例thread,然后將線程的dispSignal信號關聯到slotDisplay函數并啟動該線程,最后將thread添加到列表allThreads中。 第63-67行,點擊“停止所有線程”按鈕時對應的槽函數,在該函數中對列表allThreads中所有的線程調用stop函數停止線程的運行并刪除整個列表。 第69-70行,對應線程中dispSignal信號的槽函數,在該函數中將線程中傳遞過來的參數(線程的序號、id號和i的值)在文本框中逐行進行顯示。 應用程序測試代碼實現 上面已經定義了線程類和主界面窗口類,在主程序中調用這兩個類就可以完成前面例子的運行界面程序。具體實現代碼如下圖所示: 備注 這是一個比較簡單的多線程編程入門示例,僅僅介紹了怎樣在Python語言中使用PyQ界面庫創(chuàng)建、運行及停止一個線程,而對于其它諸如線程間同步等技術本例均未涉及。 如果你覺得這篇文章對你有用的話,抖抖小手點個贊吧。 |
|
來自: lgk88888 > 《原創(chuàng)》