[vlc-commits] Qt: rate limit EPG updates

Francois Cartegnie git at videolan.org
Thu Dec 15 17:34:44 CET 2016


vlc/vlc-2.2 | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Dec 15 17:25:14 2016 +0100| [2aa1eb7dbdada396fff6937dd622dfb344cd0d72] | committer: Francois Cartegnie

Qt: rate limit EPG updates

As we don't have discrete updates due to use of input variable
for events, we're updating far too many times on EPG tables updates,
reprocessing the whole EPG set. This is mainly the performance
issue with large EPG updates.

Also no longer updates internal event storage when hidden.

backport of ba78a1fe00edbbb34502704347788f3455faccf4

> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=2aa1eb7dbdada396fff6937dd622dfb344cd0d72
---

 modules/gui/qt4/dialogs/epg.cpp | 29 +++++++++++++++++++++++------
 modules/gui/qt4/dialogs/epg.hpp |  7 ++++++-
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/modules/gui/qt4/dialogs/epg.cpp b/modules/gui/qt4/dialogs/epg.cpp
index bf2c1fb..396ab3a 100644
--- a/modules/gui/qt4/dialogs/epg.cpp
+++ b/modules/gui/qt4/dialogs/epg.cpp
@@ -74,8 +74,8 @@ EpgDialog::EpgDialog( intf_thread_t *_p_intf ): QVLCFrame( _p_intf )
     layout->addWidget( descBox );
 
     CONNECT( epg, itemSelectionChanged( EPGItem *), this, displayEvent( EPGItem *) );
-    CONNECT( THEMIM->getIM(), epgChanged(), this, updateInfos() );
-    CONNECT( THEMIM, inputChanged( ), this, updateInfos() );
+    CONNECT( THEMIM->getIM(), epgChanged(), this, scheduleUpdate() );
+    CONNECT( THEMIM, inputChanged( bool ), this, updateInfos() );
 
     QDialogButtonBox *buttonsBox = new QDialogButtonBox( this );
 
@@ -92,8 +92,8 @@ EpgDialog::EpgDialog( intf_thread_t *_p_intf ): QVLCFrame( _p_intf )
 
     timer = new QTimer( this );
     timer->setSingleShot( true );
-    timer->setInterval( 1000 * 60 );
-    CONNECT( timer, timeout(), this, updateInfos() );
+    timer->setInterval( 5000 );
+    CONNECT( timer, timeout(), this, timeout() );
 
     updateInfos();
     restoreWidgetPosition( "EPGDialog", QSize( 650, 450 ) );
@@ -104,6 +104,25 @@ EpgDialog::~EpgDialog()
     saveWidgetPosition( "EPGDialog" );
 }
 
+void EpgDialog::showEvent(QShowEvent *)
+{
+    scheduleUpdate();
+}
+
+void EpgDialog::timeout()
+{
+    if( !isVisible() )
+        scheduleUpdate();
+    else
+        updateInfos();
+}
+
+void EpgDialog::scheduleUpdate()
+{
+    if( !timer->isActive() )
+        timer->start( 5000 );
+}
+
 void EpgDialog::displayEvent( EPGItem *epgItem )
 {
     if( !epgItem ) return;
@@ -122,7 +141,6 @@ void EpgDialog::displayEvent( EPGItem *epgItem )
 
 void EpgDialog::updateInfos()
 {
-    timer->stop();
     input_item_t *p_input_item = NULL;
     playlist_t *p_playlist = THEPL;
     input_thread_t *p_input_thread = playlist_CurrentInput( p_playlist ); /* w/hold */
@@ -137,7 +155,6 @@ void EpgDialog::updateInfos()
         {
             epg->updateEPG( p_input_item );
             vlc_gc_decref( p_input_item );
-            if ( isVisible() ) timer->start();
         }
     }
 }
diff --git a/modules/gui/qt4/dialogs/epg.hpp b/modules/gui/qt4/dialogs/epg.hpp
index 88bbd26..10c3ff1 100644
--- a/modules/gui/qt4/dialogs/epg.hpp
+++ b/modules/gui/qt4/dialogs/epg.hpp
@@ -36,6 +36,9 @@ class EPGWidget;
 class EpgDialog : public QVLCFrame, public Singleton<EpgDialog>
 {
     Q_OBJECT
+protected:
+    virtual void showEvent(QShowEvent * event) Q_DECL_OVERRIDE;
+
 private:
     EpgDialog( intf_thread_t * );
     virtual ~EpgDialog();
@@ -48,8 +51,10 @@ private:
     friend class    Singleton<EpgDialog>;
 
 private slots:
-    void displayEvent( EPGItem * );
+    void scheduleUpdate();
     void updateInfos();
+    void timeout();
+    void displayEvent( EPGItem * );
 };
 
 #endif



More information about the vlc-commits mailing list