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

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
  • 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

                  6/8

                  2 Aug 2018, 07:08

                  • Login

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