簡體   English   中英

從線程啟動函數。 (GUI線程和QThread錯誤)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM