我有一個QMainWindow裏面有三個小部件,它們被提升爲一個包含子類QThread的類。它們每個都在它們的q線程中繪製一個本地QImage,一旦它被繪製就發送一個信號,然後通過從插槽調用update(mandlebrot示例)來呈現。這是安全還是危險?他們不共享任何數據,至少沒有我生成的數據,並且想知道他們可以共享哪些數據,這些數據超出了我的編碼範圍,即由Qt自動生成。在三個獨立的QThreads中繪製三個獨立的QImages是否安全?
回答
QPainter的可用於油漆到QImage的,QPrinter來,和QPicture塗料設備。不支持繪製到QPixmaps和QWidgets上。在Mac OS X上,如果您從GUI線程之外進行打印,則不會顯示自動進度對話框。
任何數量的線程可以在任何給定的時間進行繪製,但是一次只能有一個線程繪製給定的繪製設備。換句話說,如果兩個線程都繪製到單獨的QImage上,則兩個線程可以同時繪製,但是兩個線程不能同時繪製到同一個QImage上。
請注意,在沒有FontConfig支持的X11系統上,Qt無法在GUI線程之外呈現文本。您可以使用QFontDatabase :: supportsThreadedFontRendering()函數來檢測是否可以在GUI線程之外使用字體渲染。
因此,只要您對X11的字體問題非常小心,請勿使用任何Pixmaps或光標(它們以Pixmaps的形式實現),並且不要嘗試在相同的圖像上繪製相同的圖像來自多個線程的時間...它應該工作。
請注意,在Mandelbrot示例中,QImage通過值傳遞給信號(隱式共享),這意味着如果任一線程嘗試寫入,它將獲得自己的副本。
好的,這些都是我遵循的指導原則,你是否對GDB的任何問題感到擔憂?在qthread中使用QList是否安全? – 2010-05-26 22:48:47
調試多線程代碼總是比單線程更棘手,但您繪製的事實不會改變這一點。像QList這樣的Qt數據結構是* reentrant *但不是*線程安全的* ...如果可以讓多個線程在相同的QList上獲得同樣的功能,則必須使用QReadWriteLock或QMutex鎖定它們時間。請參閱:http://doc.trolltech.com/4.6/threads-reentrancy.html – HostileFork 2010-05-26 23:04:28
我已經看到在以下代碼中發生seg故障:http://www.mediafire.com/?mwjlm3yltej類沒有得到任何它的數據成員可以通過線程之外的任何東西訪問,並且只有當我放置斷點時纔會出現seg錯誤。我想認爲這是gdb的錯,但那將是一種罕見的行爲。我在運行時從未遇到過seg故障。如果我複製類的源代碼三次,並將其用於每個對象實例,我不會收到此seg錯誤。當我一步一步的代碼,它並沒有遵循,並重新開始(但在一個不同的線程),所以我想gdb是所有這一切困惑。 – 2010-05-27 00:15:35
- 1. 在libgdx中繪製獨立的三角形
- 2. 獨立30分爲三個批次
- 3. 用rnorm繪製兩個獨立的100個獨立標準法線樣本?
- 4. SQL Server - SELECT WHERE三個獨立表上的三列是相等的嗎?
- 5. 既屬於第三,獨立的表
- 6. 繪製多個獨立varialbes有R
- 7. 三個獨立的標籤DIV中形式
- 8. 在兩個獨立的終端/三重窗口之間移動
- 9. 在Pandas中繪製日期獨立於
- 10. 獨立於訂單的三個輸入的廉價散列
- 11. 拆分Python的list成三個獨立的名單
- 12. 創建一個具有獨立線程的全局對象是否安全?
- 13. 在Windows中是否有獨立的dot.exe
- 14. 將三個獨立的mongodb服務器更改爲副本集?
- 15. 一筆交易,三個獨立的數據庫
- 16. 子網掩碼 - 如何分割三個獨立的網絡?
- 17. 帶有三個獨立XML文件的XQuery
- 18. 我不知道如何快速三個獨立的表
- 19. 如何閱讀本格文成三個獨立的變量
- 20. 的MSBuild配料上三個獨立變量
- 21. 兩個完全獨立的trac版本
- 22. 安卓:兩個獨立的APK
- 23. 獨立兩個字
- 24. C++:Boost cpp_dec_float是否獨立?
- 25. 建立一個獨立的委託?
- 26. Flask中的兩個函數獨立繪製數據
- 27. 在一個獨立的類中重繪/更新一個JPanel
- 28. Java使用FileHandler創建三個獨立的日誌文件,但只有在通過cron運行時才能創建三個獨立的日誌文件
- 29. Ruby中是否有獨立的i18n庫?
- 30. SQL:兩個獨立的行
gtk並不真的屬於這個問題。 – 2010-05-26 22:44:52