[Qt-interest] Qt, DirectX and MultiThreading

John Vilburn john at ohanasoftware.com
Thu Apr 15 10:07:07 CEST 2010


I'm not sure if this has anything to do with your bug, but in the QTimer documentation it says

"To start an event loop from a non-GUI thread, use QThread::exec(). Qt uses the timer's thread affinity to determine which thread will emit the timeout() signal. Because of this, you must start and stop the timer in its thread; it is not possible to start a timer from another thread."

You may already be doing this right, but it is worth looking at to make sure.

John


On Apr 14, 2010, at 9:30 PM, Ender EREL wrote:

> Hello everyone,
> 
> Yeah, i know, i am walking in very dangerous, murky waters here so if 
> you want, you can close this message now. But if you like challenges, 
> stay tuned in for a bucket-load of fun!
> 
> I am developing on Win7 using Qt 4.5.3 & MSVC2008.
> 
> We have a 3D Engine that uses DirectX and i am given the task of 
> integrating this with Qt. My aim is to enable DirectX rendering on a 
> QWidget surface. I completed this successfully by giving the HWND of my 
> widget to the engine where my colleagues take over. Victory!
> 
> Everything was going perfectly, until i opened a modal dialog 
> (QFileDialog to be exact), which stops the execution of Qt's Event Loop, 
> which manages QTimers including the most important QTimer for me: the 
> QTimer (a zero-timer) that triggers the DirectX rendering. I facepalm'd.
> 
> So, when a modal dialog is opened (or QApplication event-loop is blocked 
> in some way) my rendering stops, which is not critical, but creates an 
> unpleasant experience.
> 
> Then i decided to dive deeper into this. I said to myself: "Hey, why not 
> trigger the rendering in another thread? Everthing will be perfect!". I 
> was wrong.
> 
> Yes, this is the background part for my problem. here comes the unveiling:
> 
> When the app is first launched, everything is fine. Both threads (main & 
> rendering) do their job happily. Until i interact with the GUI in any 
> way. The main thread locks up but the rendering thread does its job nicely.
> 
> I did what any developer would do. I debugged. And found out that my 
> main thread hangs at QRasterWindowSurface::flush(), line 185, where it 
> calls BitBlt. Examining the stack trace, i saw that the widget that 
> causes the hanging is not my DirectX Widget but its parent's parent, 
> which is a top level window. I will paste the stack trace below, if 
> anyone is still reading and wants to take a look.
> 
> Stack trace:
> 
>  gdi32.dll!75ca5f3e() 	
>  [Frames below may be incorrect and/or missing, no symbols loaded for 
> gdi32.dll]	
>  gdi32.dll!75ca5f3e() 	
>  gdi32.dll!75ca5f1d() 	
>  QtGuid4.dll!QRasterWindowSurface::flush(QWidget * widget=0x01f90340, 
> const QRegion & rgn={...}, const QPoint & offset={...})  Line 187
>  QtGuid4.dll!qt_flush(QWidget * widget=0x01f90340, const QRegion & 
> region={...}, QWindowSurface * windowSurface=0x0232ee28, QWidget * 
> tlw=0x003efc18, const QPoint & tlwOffset={...})  Line 99
>  QtGuid4.dll!QWidgetBackingStore::flush(QWidget * widget=0x00000000, 
> QWindowSurface * surface=0x00000000)  Line 1344 + 0x27 bytes
>  QtGuid4.dll!QWidgetBackingStore::endPaint(const QRegion & 
> cleaned={...}, QWindowSurface * windowSurface=0x0232ee28, BeginPaintInfo 
> * beginPaintInfo=0x003ed77c)  Line 384
>  QtGuid4.dll!QWidgetBackingStore::sync()  Line 1317
>  QtGuid4.dll!QWidgetPrivate::syncBackingStore()  Line 1605
>  QtGuid4.dll!QWidget::event(QEvent * event=0x0206a358)  Line 7833
>  ...
> 
> 
> So, does anyone have any idea why this is happening? Or how this can be 
> solved?
> 
> Thank you for your time,
> 
> Best Regards
> -- 
> Ender EREL
> 
> 
> Next episode on murky waters: "DirectX rendering as background of 
> QGraphicsView." In multithreaded vision!
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest





More information about the Qt-interest-old mailing list