Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Program crash when it loads videos from multiple directories continuously
Forum Updated to NodeBB v4.3 + New Features

Program crash when it loads videos from multiple directories continuously

Scheduled Pinned Locked Moved Unsolved General and Desktop
qt creatorslidersignal & slotqt5.11
8 Posts 3 Posters 1.6k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    Kinesis
    wrote on 2 Aug 2018, 03:28 last edited by
    #1

    I have code that loads videos from directories which are chosen by user.There will be many subdirs in listwidget , and the user can choose continuously.But when the user change the subdirectories quickly, the program crashed . Video player include play/pause button and postion slider(can skip,change position according to video playing time) . Here is the code .

    connect (button , &QAbstractButton::clicked,[label,listWidget_main,listWidget_dirList,this]{
    
            QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",
    
                                                               QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
    
            label->setText(directory.absolutePath());
            QStringList dirs = directory.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
            listWidget_dirList->addItems(dirs);
    
            connect(listWidget_dirList, & QListWidget::currentRowChanged,[listWidget_dirList,directory,listWidget_main,this](int currentRow)
    
            {
                //listWidget_dirList->setEnabled(false);
                listWidget_main->show();
                listWidget_main->clear();
    
                QListWidgetItem *item = listWidget_dirList->item(currentRow);
                QDir dir = directory.absolutePath() + '/'+item->text()  ;
                dir.setNameFilters({"*.mp4" , "*.avi" , "*.flv" , "*.mwv"});
    
                for(const QFileInfo & finfo: dir.entryInfoList()){
                    QMediaPlayer *mediaPlayer = new QMediaPlayer();
                    mediaPlayer->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
                    videoItem = new QGraphicsVideoItem;
                    videoItem->setSize(QSize(320,240));
                    QGraphicsScene *scene = new QGraphicsScene(this);
                    QGraphicsView *graphicsView = new QGraphicsView(scene);
                    mediaPlayer->setVideoOutput(videoItem);
    
                    QPushButton *m_playButton = new QPushButton();
                    m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
    
                    connect(m_playButton, &QAbstractButton::clicked, [mediaPlayer]() {
                        switch (mediaPlayer->state()) {
                        case QMediaPlayer::PlayingState:
                            mediaPlayer->pause();
                            break;
                        default:
                            mediaPlayer->play();
                            break;
                        }
                    });
    
    
                    connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state) {
                        switch(state) {
                        case QMediaPlayer::PlayingState:
                            m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
                            break;
                        default:
                            m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
                            break;
                        }
                    });
    
    
    
                    QSlider *m_positionSlider = new QSlider(Qt::Horizontal,this);
                    m_positionSlider->setRange(0,mediaPlayer->duration() / 1000);
    
    
                    connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
    
                        m_positionSlider->setValue(position);
                    });
    
                    connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
    
                        m_positionSlider->setRange(0,duration);
                    });
    
    
                    connect(m_positionSlider ,&QAbstractSlider::sliderMoved, [mediaPlayer ,this] (int position){
    
                        mediaPlayer->setPosition(position);
                    });
    
    
    
    
                    auto    item = new QListWidgetItem("", listWidget_main);
                    auto    widget = new QWidget;
                    auto    label = new QLabel(finfo.fileName());
                    auto    vb = new QVBoxLayout;
    
                    QBoxLayout *controlLayout = new QHBoxLayout;
                    controlLayout->setMargin(0);
                    controlLayout->addWidget(m_playButton);
                    controlLayout->addWidget(m_positionSlider);
    
                    vb->addWidget(label);
                    vb->addWidget(graphicsView);
                    vb->addLayout(controlLayout);
                    widget->setLayout(vb);
                    widget->setMinimumSize(340, 340);
                    listWidget_main->setItemWidget(item,widget);
                    player.append(mediaPlayer);
                    scene->addItem(videoItem);
    
    
    
                }
    });
        });
    

    The debugger shows that this part is where it stopped.

    connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
    
                        m_positionSlider->setValue(position);
                    });
    
                    connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
    
                       m_positionSlider->setRange(0,duration);
                    });
    

    So I disabled position slider and it works completely fine . But I need to use position slider . I don't know how can I fix it.

    J 1 Reply Last reply 2 Aug 2018, 05:01
    0
    • K Kinesis
      2 Aug 2018, 03:28

      I have code that loads videos from directories which are chosen by user.There will be many subdirs in listwidget , and the user can choose continuously.But when the user change the subdirectories quickly, the program crashed . Video player include play/pause button and postion slider(can skip,change position according to video playing time) . Here is the code .

      connect (button , &QAbstractButton::clicked,[label,listWidget_main,listWidget_dirList,this]{
      
              QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",
      
                                                                 QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
      
              label->setText(directory.absolutePath());
              QStringList dirs = directory.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
              listWidget_dirList->addItems(dirs);
      
              connect(listWidget_dirList, & QListWidget::currentRowChanged,[listWidget_dirList,directory,listWidget_main,this](int currentRow)
      
              {
                  //listWidget_dirList->setEnabled(false);
                  listWidget_main->show();
                  listWidget_main->clear();
      
                  QListWidgetItem *item = listWidget_dirList->item(currentRow);
                  QDir dir = directory.absolutePath() + '/'+item->text()  ;
                  dir.setNameFilters({"*.mp4" , "*.avi" , "*.flv" , "*.mwv"});
      
                  for(const QFileInfo & finfo: dir.entryInfoList()){
                      QMediaPlayer *mediaPlayer = new QMediaPlayer();
                      mediaPlayer->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
                      videoItem = new QGraphicsVideoItem;
                      videoItem->setSize(QSize(320,240));
                      QGraphicsScene *scene = new QGraphicsScene(this);
                      QGraphicsView *graphicsView = new QGraphicsView(scene);
                      mediaPlayer->setVideoOutput(videoItem);
      
                      QPushButton *m_playButton = new QPushButton();
                      m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
      
                      connect(m_playButton, &QAbstractButton::clicked, [mediaPlayer]() {
                          switch (mediaPlayer->state()) {
                          case QMediaPlayer::PlayingState:
                              mediaPlayer->pause();
                              break;
                          default:
                              mediaPlayer->play();
                              break;
                          }
                      });
      
      
                      connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state) {
                          switch(state) {
                          case QMediaPlayer::PlayingState:
                              m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
                              break;
                          default:
                              m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
                              break;
                          }
                      });
      
      
      
                      QSlider *m_positionSlider = new QSlider(Qt::Horizontal,this);
                      m_positionSlider->setRange(0,mediaPlayer->duration() / 1000);
      
      
                      connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
      
                          m_positionSlider->setValue(position);
                      });
      
                      connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
      
                          m_positionSlider->setRange(0,duration);
                      });
      
      
                      connect(m_positionSlider ,&QAbstractSlider::sliderMoved, [mediaPlayer ,this] (int position){
      
                          mediaPlayer->setPosition(position);
                      });
      
      
      
      
                      auto    item = new QListWidgetItem("", listWidget_main);
                      auto    widget = new QWidget;
                      auto    label = new QLabel(finfo.fileName());
                      auto    vb = new QVBoxLayout;
      
                      QBoxLayout *controlLayout = new QHBoxLayout;
                      controlLayout->setMargin(0);
                      controlLayout->addWidget(m_playButton);
                      controlLayout->addWidget(m_positionSlider);
      
                      vb->addWidget(label);
                      vb->addWidget(graphicsView);
                      vb->addLayout(controlLayout);
                      widget->setLayout(vb);
                      widget->setMinimumSize(340, 340);
                      listWidget_main->setItemWidget(item,widget);
                      player.append(mediaPlayer);
                      scene->addItem(videoItem);
      
      
      
                  }
      });
          });
      

      The debugger shows that this part is where it stopped.

      connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
      
                          m_positionSlider->setValue(position);
                      });
      
                      connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
      
                         m_positionSlider->setRange(0,duration);
                      });
      

      So I disabled position slider and it works completely fine . But I need to use position slider . I don't know how can I fix it.

      J Offline
      J Offline
      jsulm
      Lifetime Qt Champion
      wrote on 2 Aug 2018, 05:01 last edited by
      #2

      @Kinesis said in Program crash when it loads videos from multiple directories continuously:

      connect(listWidget_dirList, & QListWidget::currentRowChanged,

      Are you aware that you do this connect everytime your "button" is clicked?

      I guess your "m_positionSlider" was deleted and new one created in the meantime? Where do you actually delete them? I only see where you create new m_positionSlider. Where do you delete "mediaPlayer"? The code you posted looks like you have many memory leaks.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      K 1 Reply Last reply 2 Aug 2018, 06:17
      4
      • J jsulm
        2 Aug 2018, 05:01

        @Kinesis said in Program crash when it loads videos from multiple directories continuously:

        connect(listWidget_dirList, & QListWidget::currentRowChanged,

        Are you aware that you do this connect everytime your "button" is clicked?

        I guess your "m_positionSlider" was deleted and new one created in the meantime? Where do you actually delete them? I only see where you create new m_positionSlider. Where do you delete "mediaPlayer"? The code you posted looks like you have many memory leaks.

        K Offline
        K Offline
        Kinesis
        wrote on 2 Aug 2018, 06:17 last edited by
        #3

        @jsulm
        Yes I am aware that I do this connect everytime the "button" is clicked.

        "I guess your "m_positionSlider" was deleted and new one created in the meantime? Where do you actually delete them?"
        Ans:: This is all the code that I am doing now. I think I haven't delected mediaPlayer.
        I also think that my code has memory leak . That's why I am stuck here.

        1 Reply Last reply
        0
        • S Offline
          S Offline
          SGaist
          Lifetime Qt Champion
          wrote on 2 Aug 2018, 06:21 last edited by
          #4

          Hi,

          You are continuously creating new objects (QMediaPlayer, QGraphicsView, etc.) without ever deleting them or re-using them. Start by fixing that and your leaks should stop.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          2
          • K Offline
            K Offline
            Kinesis
            wrote on 2 Aug 2018, 06:57 last edited by
            #5

            @jsulm
            As @SGaist said I am continuously creating new objects (QMediaPlayer, QGraphicsView, etc.) without ever deleting them or re-using them .
            OK, how can I delect or reuse them . Ref please

            J 1 Reply Last reply 2 Aug 2018, 07:08
            0
            • K Kinesis
              2 Aug 2018, 06:57

              @jsulm
              As @SGaist said I am continuously creating new objects (QMediaPlayer, QGraphicsView, etc.) without ever deleting them or re-using them .
              OK, how can I delect or reuse them . Ref please

              J Offline
              J Offline
              jsulm
              Lifetime Qt Champion
              wrote on 2 Aug 2018, 07:08 last edited by
              #6

              @Kinesis said in Program crash when it loads videos from multiple directories continuously:

              OK, how can I delect or reuse them

              Like any other object in C++

              delete object;
              

              You need to keep the pointers somewhere to be able to do so.

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              K 1 Reply Last reply 2 Aug 2018, 07:55
              0
              • J jsulm
                2 Aug 2018, 07:08

                @Kinesis said in Program crash when it loads videos from multiple directories continuously:

                OK, how can I delect or reuse them

                Like any other object in C++

                delete object;
                

                You need to keep the pointers somewhere to be able to do so.

                K Offline
                K Offline
                Kinesis
                wrote on 2 Aug 2018, 07:55 last edited by
                #7

                @jsulm
                Ok , in my case where should I delete or reuse?

                J 1 Reply Last reply 2 Aug 2018, 08:10
                0
                • K Kinesis
                  2 Aug 2018, 07:55

                  @jsulm
                  Ok , in my case where should I delete or reuse?

                  J Offline
                  J Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on 2 Aug 2018, 08:10 last edited by
                  #8

                  @Kinesis You should delete them when they are not needed anymore

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  1

                  8/8

                  2 Aug 2018, 08:10

                  • Login

                  • Login or register to search.
                  8 out of 8
                  • First post
                    8/8
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved