2010-05-26 65 views
1

我有一個QMainWindow裏面有三個小部件,它們被提升爲一個包含子類QThread的類。它們每個都在它們的q線程中繪製一個本地QImage,一旦它被繪製就發送一個信號,然後通過從插槽調用update(mandlebrot示例)來呈現。這是安全還是危險?他們不共享任何數據,至少沒有我生成的數據,並且想知道他們可以共享哪些數據,這些數據超出了我的編碼範圍,即由Qt自動生成。在三個獨立的QThreads中繪製三個獨立的QImages是否安全?

+0

gtk並不真的屬於這個問題。 – 2010-05-26 22:44:52

回答

3

the documentation

QPainter的可用於油漆到QImage的,QPrinter來,和QPicture塗料設備。不支持繪製到QPixmaps和QWidgets上。在Mac OS X上,如果您從GUI線程之外進行打印,則不會顯示自動進度對話框。

任何數量的線程可以在任何給定的時間進行繪製,但是一次只能有一個線程繪製給定的繪製設備。換句話說,如果兩個線程都繪製到單獨的QImage上,則兩個線程可以同時繪製,但是兩個線程不能同時繪製到同一個QImage上。

請注意,在沒有FontConfig支持的X11系統上,Qt無法在GUI線程之外呈現文本。您可以使用QFontDatabase :: supportsThreadedFontRendering()函數來檢測是否可以在GUI線程之外使用字體渲染。

因此,只要您對X11的字體問題非常小心,請勿使用任何Pixmaps或光標(它們以Pixmaps的形式實現),並且不要嘗試在相同的圖像上繪製相同的圖像來自多個線程的時間...它應該工作。

請注意,在Mandelbrot示例中,QImage通過值傳遞給信號(隱式共享),這意味着如果任一線程嘗試寫入,它將獲得自己的副本。

+0

好的,這些都是我遵循的指導原則,你是否對GDB的任何問題感到擔憂?在qthread中使用QList是否安全? – 2010-05-26 22:48:47

+1

調試多線程代碼總是比單線程更棘手,但您繪製的事實不會改變這一點。像QList這樣的Qt數據結構是* reentrant *但不是*線程安全的* ...如果可以讓多個線程在相同的QList上獲得同樣的功能,則必須使用QReadWriteLock或QMutex鎖定它們時間。請參閱:http://doc.trolltech.com/4.6/threads-reentrancy.html – HostileFork 2010-05-26 23:04:28

+0

我已經看到在以下代碼中發生seg故障:http://www.mediafire.com/?mwjlm3yltej類沒有得到任何它的數據成員可以通過線程之外的任何東西訪問,並且只有當我放置斷點時纔會出現seg錯誤。我想認爲這是gdb的錯,但那將是一種罕見的行爲。我在運行時從未遇到過seg故障。如果我複製類的源代碼三次,並將其用於每個對象實例,我不會收到此seg錯誤。當我一步一步的代碼,它並沒有遵循,並重新開始(但在一個不同的線程),所以我想gdb是所有這一切困惑。 – 2010-05-27 00:15:35