[英]Start a function from a thread. (GUI thread and QThread errors)
我已經使用Python的線程模塊制作了例程,以運行一個子進程並等待其完成。 我用以下行進行線程處理:
t1=Thread(target=self.routineFunction, args=(self, "file1.txt", "file2.txt", self.nextFunction)).start()
在我的函數例程函數內部(自我,文件1,文件2,下一個函數),我在子進程完成運行后調用下一個要運行的函數。
在此之前,一切正常。
但是,如果我在下一個函數中創建新的QObject項目,則會收到很多錯誤:-“ QPixmap:在GUI線程外使用像素圖並不安全”-“ QObject :: startTimer:QTimer僅可用於啟動線程使用QThread”
我的猜測是,當我從例程中調用nextFunction時,它在與例程相同的線程中運行,因此出現了錯誤。 有沒有辦法從“主”線程或“普通”線程內部的例程中調用函數?
謝謝您的幫助。
通常,可以從其他線程調用函數。 但是許多GUI庫(其中包括QT)對此行為都有一些限制。
例如,有一個名為“ GUI線程”的指定線程,該線程處理所有圖形化內容,例如從OS分發消息,重繪窗口等。並且,您還限制僅使用此線程來使用GUI。 因此,例如,您不應在其他線程中創建QPixmap
。
QTimer
使用一些QThread
的內部數據,因此您應該在僅以QThread
開頭的線程中使用此類計時器,而不能與普通Python thread
模塊一起使用。
回到您的問題,如果您想使用QT,則應使用QThread
生成線程,並使用postEvent()
方法將事件發布到GUI線程。 這將保證QT內部數據結構的一致性。
因此,您可以在任何QT線程中運行代碼,但是如果要使用GUI(您的QObject
使用QPixmap
,就是這種情況),則僅需要在GUI線程中處理此類調用。
好的,所以我認為可以采用解決方案。 不幸的是,我發現很難將我當前的腳本從Thread轉換為QThread(一般來說,我是線程的新手)。
我找到了一種解決方法:我沒有傳遞nextFunction作為參數,而是傳遞了queue = Queue.Queue(),並且如果我的新線程中的子進程成功,則使用queue.put(True)。 沒有更多的nextFunction了,我只是使用queue.get()等待隊列中的值。 通過這樣做,我可以繼續在GUI線程中進行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.