diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8139bf12be8baf5381ec0e04301d17dc2041a626..0dd53bacfeb7cfbc8997505e5e786e209b0a118a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,7 +117,7 @@ endif ()
 # Qt
 find_package(
   Qt5 5.14
-  COMPONENTS Widgets OpenGL Xml Core PrintSupport
+  COMPONENTS Widgets OpenGL Xml Core PrintSupport Concurrent
   REQUIRED)
 
 # OpenCV
@@ -169,6 +169,7 @@ target_link_libraries(petrack_core PUBLIC
   Qt5::Xml
   Qt5::Core
   Qt5::PrintSupport
+  Qt5::Concurrent
 )
 
 target_include_directories(petrack_core PRIVATE "${CMAKE_SOURCE_DIR}/ui")
diff --git a/src/player.cpp b/src/player.cpp
index fb450df5f8cf66c1072e83e4308e0ea81d5640c3..0ad04dff42e5c3706bc8c7a115580f0116f22728 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -27,6 +27,7 @@
 #include <QLineEdit>
 #include <QLabel>
 #include <QIntValidator>
+#include <QtConcurrent>
 
 #include "player.h"
 #include "animation.h"
@@ -256,7 +257,10 @@ bool Player::updateImage()
     double time1 = 0.0, tstart;
     tstart = clock();
 #endif
-    mMainWindow->updateImage(mImg);
+
+    QFuture<void> future = QtConcurrent::run([&]() {mMainWindow->updateImage(mImg); });
+    future.waitForFinished();
+
     if (mRec)
     {
         mAviFile.appendFrame((const unsigned char*) mImg.data, true);
@@ -271,7 +275,6 @@ bool Player::updateImage()
     mSlider->setValue(mAnimation->getCurrentFrameNum()); //(1000*mAnimation->getCurrentFrameNum())/mAnimation->getNumFrames());
     mFrameNum->setText(QString().number(mAnimation->getCurrentFrameNum()));
     mSliderSet = false; // reset setSlider here because if value doesnt change than it would not be reset by skiptoframe
-    qApp->processEvents(); // to allow event while playing
 
     return true;
 }