[Qt-interest] QPainter: It is not safe to use drawPixmap() outside the GUI thread

Andre Somers andre at familiesomers.nl
Thu Oct 29 08:47:14 CET 2009


Andre Somers wrote:
> Serge wrote:
>   
>> Thank you for all answers.
>>
>> I want to understand, why i can not use QPixmap from the other thread.
>>
>> Ander wrote: "Yes. Don't do GUI painting outside the GUI thread. Ever."
>>
>> Can you please explain or give some links, what is GUI painting? What is 
>> the difference between GUI painting and non-GUI painting? Why when i use 
>> QPixmap i use GUI painting?
>>   
>>     
> First of all: please search the mailinglist archives. This topic is 
> discussed frequently.
> A short answer is that a pixmap is* a datastructure that may reside 
> outside the program memory, and it being manipulated through some 
> graphics interface. It may, for instance, reside on the videocard where 
> drawing operations to it are accelerated. Access to such resources must 
> be serialized, otherwise you get undefined results. Threading makes it 
> impossible to do that. All GUI elements are in the end painted on such 
> pixmap surfaces, so you can not paint to these resources from any thread 
> but the main thread.
>
> There are of course much more detailed, nuanced and more correct 
> explanations available, but this should give you a rough idea.
>
> I was talking about GUI painting when I perhaps should have said pixmap 
> painting. If you use a QImage to draw on instead of a QPixmap, you are 
> sure to work with a resource that belongs to your own application that 
> you have full control over. You *can* paint to this in a thread! A 
> frequent method of using threaded rendering is to paint to such QImages 
> in threads, send them to the GUI thread when they are done, and have the 
> GUI thread paint those images to it's UI.
>
> André
>   
I forgot to add the footnote:

* this is not really true on all platforms or with all drawing engines.




More information about the Qt-interest-old mailing list