Why modifying GUI from worker thread does not rise access violation
-
Hi,
I tried to update a GUI from a worker thread and strangely no exception is caught and the GUI is modified normally. However, I have randomely some access violation from Qt5GUI.dll.
I want to know if that is possible ( that modifying a GUI from background thread may work ) and please explain me how the access violation occurs is this case.
Thank you in advance.
-
Yes it is possible. Nothing stops from you doing this. Can you tell me the run time error you hit when access violation happens ? It must be failing with 'sendEvent(...) method when you access the UI from other thread.
-
Modifying the GUI from a worker thread is not an access violation. However, it often causes data corruption. Qt's GUI classes are not "synchronized":http://doc.qt.io/qt-5/threads-synchronizing.html so it is not safe to modify them from different threads.
Your worker thread should do one of the following:
Emit a signal, to run a slot in the GUI thread, OR
Use QMetaObject::invokeMethod() to run a slot in the GUI thread
[quote author="Dheerendra" date="1425395696"]Yes it is possible. Nothing stops from you doing this.[/quote]No it's not. See the "documentation":http://doc.qt.io/qt-5/threads-qobject.html -- "GUI classes, notably QWidget and all its subclasses, are not reentrant. They can only be used from the main thread."