Qt UI Animation jerks in a multiThreaded application!
I have a problem while animating switching of screen in MultiThreaded Qt Application.
I have a multiThreaded application the main UI Thread and the worker Thread. I have set the UI Thread with TimeCriticalPriority and the worker thread with the Normal Priority. So that my UI does not freeze at any point of time. But when i try to animate a screen for switching from one screen to other screen I see jerks on the UI.
The problem here is, when the UI Thread is animating to switch the screens, the platform switches from UI Thread to the Worker thread resulting in jerks. How can i solve this issue ?
I suppose the following solutions might help me to resolve these issues. But how do i implement the solution ?
1. Making the worker thread wait untill the animation in UI thread is finished. – how should i make the worker thread wait ?
2. Making the UI thread busy untill the animation gets over ? – how can i make the worker thread busy ? (possible work around
solution might be calling some other functions in UI Thread so it does not switch to worker thread).
Is there any other way to switch the screens from left to right or vise versa without usingQPropertyAnimation in QT?
Any suggestion/help on this is highly appriciated.
Can anyone please let me know the possible solutions for this ?
Thanks in advance.
Thank you Andre, for the suggestion.
As you suggested, I tried setting the worker thread to the IdlePriorit, but this did not help I can still find the jerks while animating.
In my case the worker thread is busy listening the events from other applications. What i observed is if the worker thread does not receive any events from the other application during the animation process than the animation of screens happens very smoothly. And if the worker thread receives any event during the animation process than I see jerks in the animation.
I was wondering, Is there any way to force the worker thread sleep during the animation process ?
I’m working on windows CE 6.0.
Few things are not very clear for me.
I tried calling workerThred->wait(5000) from the main UI thread but this is blocking my main UI thread for 5000 mili seconds and not the worker thread, I suppose this is because worker thread was created on main UI Thread. And i am am not able to use sleep since Sleep() is a prtotected member funtion of a QThread.
I face the simillar problem when i call sleep() from worker thread.
- QAPP app();
- WorkerThread *pThread =new WorkerThread;
- Display MainWindow(WorkerThread)
- WorkerThread->sleep(2); // When i call this The UI thread sleeps for 2 seconds.
Please do let me know, In case if you feel i might be doing something wrong.
[EDIT: code formatting, please wrap in @-tags, Volker]
@varunjajee: you said “I tried calling workerThred->wait(5000) from the main UI thread but this is blocking my main UI thread for 5000 mili seconds and not the worker thread” — and yes, this is because you called that function from the main thread. Have you read http://developer.qt.nokia.com/wiki/Threads_Events_QObjects as it’s a very useful resource.
You state that while the UI thread is performing the animation, the OS is performing a context switch and the worker thread is running, causing the animation to jerk. Note that there are other possibilities (eg, the main thread doing something which requires acquiring locks, resulting in codepaths which take a substantial amount of time, being run — resulting in skipped frames, etc) which could cause jerky animation, but from your description it does seem like a context switch is occurring so that the worker thread can handle the events posted to it.
I don’t know whether this would work, but to solve that problem you could try sending a high-priority event from the main thread to the worker thread, telling it to wait on a mutex / semaphore; then once the main ui has finished the animation, release the mutex or decrement the semaphore, which allows the worker thread to continue processing events.