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 freeze when try to get MD5 of files
Forum Updated to NodeBB v4.3 + New Features

Program freeze when try to get MD5 of files

Scheduled Pinned Locked Moved Unsolved General and Desktop
31 Posts 6 Posters 2.8k Views 3 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.
  • S Offline
    S Offline
    saeid0034
    wrote on 24 Sept 2020, 19:21 last edited by saeid0034
    #1

    Hi im using this code for generate MD5 of files in QT

    QString Md5_gen(QString const &s)
    {
        QString pakchunk_Md5;
        QCryptographicHash crypto(QCryptographicHash::Md5);
        QFile pakchunk(QDir::currentPath() + s);
        if (pakchunk.open(QFile::ReadOnly))
        {
            while(!pakchunk.atEnd()){
            crypto.addData(pakchunk.read(8192));
            }
        } else
        {
            qDebug() << "Can't open file.";
            pakchunk_Md5 = "nofile";
            return pakchunk_Md5
        }
        pakchunk_Md5 = crypto.result().toHex();
        return pakchunk_Md5;
    }
    

    its work well, but problem is when program start to generate MD5 of files, gui Freeze until all MD5 generated.
    how can i fix this problem?

    1 Reply Last reply
    0
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 24 Sept 2020, 19:22 last edited by
      #2

      Hi,

      One way is to offload the work using QtConcurrent.

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

      S 1 Reply Last reply 24 Sept 2020, 19:35
      4
      • S Offline
        S Offline
        sierdzio
        Moderators
        wrote on 24 Sept 2020, 19:24 last edited by
        #3

        @saeid0034 said in Program freeze when try to get MD5 of files:

        crypto.addData(pakchunk.read(8192));

        Please note that you are also wasting RAM using this approach. Use the QIODevice overload to get the same result - without a loop and with less memory used.

        (Z(:^

        1 Reply Last reply
        3
        • S Offline
          S Offline
          sierdzio
          Moderators
          wrote on 24 Sept 2020, 19:25 last edited by
          #4

          Also, you probably should add return pakchunk_Md5; in your else block.

          (Z(:^

          S 1 Reply Last reply 24 Sept 2020, 19:33
          2
          • S sierdzio
            24 Sept 2020, 19:25

            Also, you probably should add return pakchunk_Md5; in your else block.

            S Offline
            S Offline
            saeid0034
            wrote on 24 Sept 2020, 19:33 last edited by saeid0034
            #5

            @sierdzio thanks yes you are right, i edited my code
            and about using QIODevice, do you have any example for it?

            1 Reply Last reply
            0
            • S SGaist
              24 Sept 2020, 19:22

              Hi,

              One way is to offload the work using QtConcurrent.

              S Offline
              S Offline
              saeid0034
              wrote on 24 Sept 2020, 19:35 last edited by
              #6

              @SGaist thanks for reply, do you have any example close to my problem?

              1 Reply Last reply
              0
              • S Offline
                S Offline
                SGaist
                Lifetime Qt Champion
                wrote on 24 Sept 2020, 19:39 last edited by
                #7

                Did you check the examples from the documentation ?

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

                S 1 Reply Last reply 24 Sept 2020, 19:48
                1
                • S SGaist
                  24 Sept 2020, 19:39

                  Did you check the examples from the documentation ?

                  S Offline
                  S Offline
                  saeid0034
                  wrote on 24 Sept 2020, 19:48 last edited by
                  #8

                  @SGaist i need to use what function of QtConcurrent?

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    saeid0034
                    wrote on 24 Sept 2020, 20:26 last edited by
                    #9

                    i use this code (i dont know if its right or not)

                    QString loc40 = "/file/test.pak";
                        QFuture<QString> future40 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc40);
                        QString pakchunk40 = future40.result();
                    

                    but program freeze again

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on 24 Sept 2020, 20:58 last edited by
                      #10

                      As explained in the result documentation, it will block if the computation is not done. Use QFutureWatcher with signals and slots to properly make things asynchronous.

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

                      S 1 Reply Last reply 24 Sept 2020, 21:03
                      2
                      • S SGaist
                        24 Sept 2020, 20:58

                        As explained in the result documentation, it will block if the computation is not done. Use QFutureWatcher with signals and slots to properly make things asynchronous.

                        S Offline
                        S Offline
                        saeid0034
                        wrote on 24 Sept 2020, 21:03 last edited by
                        #11

                        @SGaist The computation is done
                        Because the outputs are correct after the program exits From freeze, the only problem is program freeze, no matter how i try, and i sure problem coming from MD5 Generation

                        1 Reply Last reply
                        0
                        • S Offline
                          S Offline
                          saeid0034
                          wrote on 24 Sept 2020, 23:04 last edited by
                          #12

                          i test Q In my code

                              QFutureWatcher<void>* watcher = new QFutureWatcher<void>();
                              connect(watcher, SIGNAL(finished()), this, SLOT(Md5_gen()));
                              watcher->setFuture(future33);
                          

                          It is wrong or ok?
                          i dont know how add my function to slot, i just put my md5 function name on it

                          1 Reply Last reply
                          0
                          • S Offline
                            S Offline
                            saeid0034
                            wrote on 24 Sept 2020, 23:16 last edited by
                            #13

                            here is my full code for now

                            QString Md5_gen(QString const &s)
                            {
                                QString pakchunk_Md5;
                                QCryptographicHash crypto(QCryptographicHash::Md5);
                                QFile pakchunk(QDir::currentPath() + s);
                                if (pakchunk.open(QIODevice::ReadOnly))
                                {
                                    while(!pakchunk.atEnd()){
                                    crypto.addData(pakchunk.read(8192));
                                    }
                                } else
                                {
                                    qDebug() << "Can't open file.";
                                    pakchunk_Md5 = "nofile";
                                    return pakchunk_Md5;
                                }
                                pakchunk_Md5 = crypto.result().toHex();
                                return pakchunk_Md5;
                            }
                            
                            MainWindow2::MainWindow2(QWidget *parent) :
                                QMainWindow(parent),
                                ui(new Ui::MainWindow2)
                            {
                                ui->setupUi(this);
                            }
                            
                            MainWindow2::~MainWindow2()
                            {
                                delete ui;
                            }
                            
                            void MainWindow2::on_pushButton_clicked()
                            {
                                int file_ok = 0;
                            
                                QFutureWatcher<void>* watcher = new QFutureWatcher<void>();
                                connect(watcher, SIGNAL(finished()), this, SLOT(Md5_gen()));
                                //file pak33
                                QString loc33 = "/SM/test.pak";
                                QFuture<QString> future33 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc33);
                                QString pakchunk33 = future33.result();
                                watcher->setFuture(future33);
                                qDebug() << pakchunk33;
                                if (pakchunk33 == "f7002d4419cd235a87746715ba6fb2ea")
                                {
                                    qDebug() << "OK";
                                    file_ok++;
                                    ui->label_8->setText("OK");
                                    ui->label_8->setStyleSheet("QLabel { color : green; }");
                                } else if (pakchunk33 == "nofile")
                                {
                                    qDebug() << "no file found";
                                    ui->label_8->setText("not found");
                                    ui->label_8->setStyleSheet("QLabel { color : red; }");
                                } else
                                {
                                    qDebug() << "file is diffrent";
                                    ui->label_8->setText("wrong");
                                    ui->label_8->setStyleSheet("QLabel { color : red; }");
                                }
                            
                                //file pak34
                                QString loc34 = "/SM/test2.pak";
                                QFuture<QString> future34 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc34);
                                QString pakchunk34 = future34.result();
                                qDebug() << pakchunk34;
                                watcher->setFuture(future34);
                                if (pakchunk34 == "64c77598586b6c3cb60beed0b0750620")
                                {
                                    qDebug() << "OK";
                                    file_ok++;
                                    ui->label->setText("OK");
                                    ui->label->setStyleSheet("QLabel { color : green; }");
                                } else if (pakchunk34 == "nofile")
                                {
                                    qDebug() << "no file found";
                                    ui->label->setText("not found");
                                    ui->label->setStyleSheet("QLabel { color : red; }");
                                } else
                                {
                                    qDebug() << "file is diffrent";
                                    ui->label->setText("wrong");
                                    ui->label->setStyleSheet("QLabel { color : red; }");
                                }
                            
                                //file pak35
                                QString loc35 = "/SM/test3.pak";
                                QFuture<QString> future35 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc35);
                                QString pakchunk35 = future35.result();
                                watcher->setFuture(future35);
                                qDebug() << pakchunk35;
                                if (pakchunk35 == "ee53f7a7656a32b5278c460baec46f16")
                                {
                                    qDebug() << "OK";
                                    file_ok++;
                                    ui->label_7->setText("OK");
                                    ui->label_7->setStyleSheet("QLabel { color : green; }");
                                } else if (pakchunk35 == "nofile")
                                {
                                    qDebug() << "no file found";
                                    ui->label_7->setText("not found");
                                    ui->label_7->setStyleSheet("QLabel { color : red; }");
                                } else
                                {
                                    qDebug() << "file is diffrent";
                                    ui->label_7->setText("wrong");
                                    ui->label_7->setStyleSheet("QLabel { color : red; }");
                                }
                            }
                            

                            can anyone please help me find the problem

                            1 Reply Last reply
                            0
                            • S Offline
                              S Offline
                              saeid0034
                              wrote on 24 Sept 2020, 23:28 last edited by
                              #14

                              its fully fixed by adding qApp->processEvents(); to MD5 while

                              aha_1980A 1 Reply Last reply 25 Sept 2020, 06:47
                              -1
                              • S Offline
                                S Offline
                                SGaist
                                Lifetime Qt Champion
                                wrote on 25 Sept 2020, 06:19 last edited by
                                #15

                                You do realise that your code is wrong in terms of offloading the work ? As I already wrote: result will be blocking if the computation is not finished.

                                The idea is to use the watcher so you let the computation run and in the slot connected to your QFutureWatcher you run your UI updates.

                                What you have here is mostly the same code as before, but more complicated, since you are blocking your event loop with your calls to result.

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

                                S 1 Reply Last reply 25 Sept 2020, 08:54
                                4
                                • S saeid0034
                                  24 Sept 2020, 23:28

                                  its fully fixed by adding qApp->processEvents(); to MD5 while

                                  aha_1980A Offline
                                  aha_1980A Offline
                                  aha_1980
                                  Lifetime Qt Champion
                                  wrote on 25 Sept 2020, 06:47 last edited by
                                  #16

                                  Hi @saeid0034,

                                  its fully fixed by adding qApp->processEvents(); to MD5 while

                                  For sure not! Please don't use processEvents() if you don't know what you are doing!

                                  Regards

                                  Qt has to stay free or it will die.

                                  1 Reply Last reply
                                  4
                                  • S SGaist
                                    25 Sept 2020, 06:19

                                    You do realise that your code is wrong in terms of offloading the work ? As I already wrote: result will be blocking if the computation is not finished.

                                    The idea is to use the watcher so you let the computation run and in the slot connected to your QFutureWatcher you run your UI updates.

                                    What you have here is mostly the same code as before, but more complicated, since you are blocking your event loop with your calls to result.

                                    S Offline
                                    S Offline
                                    saeid0034
                                    wrote on 25 Sept 2020, 08:54 last edited by
                                    #17

                                    @SGaist i don't know how correctly use QFutureWatcher in my code...
                                    As you can see in my full cod in above im add QFutureWatcher to my cod, is it wrong?
                                    Can you please guide me to how do this?

                                    aha_1980A 1 Reply Last reply 25 Sept 2020, 08:59
                                    0
                                    • S saeid0034
                                      25 Sept 2020, 08:54

                                      @SGaist i don't know how correctly use QFutureWatcher in my code...
                                      As you can see in my full cod in above im add QFutureWatcher to my cod, is it wrong?
                                      Can you please guide me to how do this?

                                      aha_1980A Offline
                                      aha_1980A Offline
                                      aha_1980
                                      Lifetime Qt Champion
                                      wrote on 25 Sept 2020, 08:59 last edited by
                                      #18

                                      Hi @saeid0034,

                                      As @SGaist already said, calling result() when the future is not done yet will block your event loop.

                                      You should call result() in the slot connected to finished().

                                      Regards

                                      Qt has to stay free or it will die.

                                      S 1 Reply Last reply 25 Sept 2020, 12:36
                                      3
                                      • aha_1980A aha_1980
                                        25 Sept 2020, 08:59

                                        Hi @saeid0034,

                                        As @SGaist already said, calling result() when the future is not done yet will block your event loop.

                                        You should call result() in the slot connected to finished().

                                        Regards

                                        S Offline
                                        S Offline
                                        saeid0034
                                        wrote on 25 Sept 2020, 12:36 last edited by
                                        #19

                                        @aha_1980 thanks for information
                                        problem is i dont know much about working with slots and QFutureWatcher
                                        can you please say to me i need to do what with this code?

                                        QString Md5_gen(QString const &s)
                                        {
                                            QString pakchunk_Md5;
                                            QCryptographicHash crypto(QCryptographicHash::Md5);
                                            QFile pakchunk(QDir::currentPath() + s);
                                            if (pakchunk.open(QIODevice::ReadOnly))
                                            {
                                                while(!pakchunk.atEnd()){
                                                crypto.addData(pakchunk.read(8192));
                                                }
                                            } else
                                            {
                                                qDebug() << "Can't open file.";
                                                pakchunk_Md5 = "nofile";
                                                return pakchunk_Md5;
                                            }
                                            pakchunk_Md5 = crypto.result().toHex();
                                            return pakchunk_Md5;
                                        }
                                        
                                        MainWindow2::MainWindow2(QWidget *parent) :
                                            QMainWindow(parent),
                                            ui(new Ui::MainWindow2)
                                        {
                                            ui->setupUi(this);
                                        }
                                        
                                        MainWindow2::~MainWindow2()
                                        {
                                            delete ui;
                                        }
                                        
                                        void MainWindow2::on_pushButton_clicked()
                                        {
                                            int file_ok = 0;
                                        
                                            QFutureWatcher<void>* watcher = new QFutureWatcher<void>();
                                            connect(watcher, SIGNAL(finished()), this, SLOT(Md5_gen()));
                                            //file pak33
                                            QString loc33 = "/SM/test.pak";
                                            QFuture<QString> future33 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc33);
                                            QString pakchunk33 = future33.result();
                                            watcher->setFuture(future33);
                                            qDebug() << pakchunk33;
                                            if (pakchunk33 == "f7002d4419cd235a87746715ba6fb2ea")
                                            {
                                                qDebug() << "OK";
                                                file_ok++;
                                                ui->label_8->setText("OK");
                                                ui->label_8->setStyleSheet("QLabel { color : green; }");
                                            } else if (pakchunk33 == "nofile")
                                            {
                                                qDebug() << "no file found";
                                                ui->label_8->setText("not found");
                                                ui->label_8->setStyleSheet("QLabel { color : red; }");
                                            } else
                                            {
                                                qDebug() << "file is diffrent";
                                                ui->label_8->setText("wrong");
                                                ui->label_8->setStyleSheet("QLabel { color : red; }");
                                            }
                                        
                                            //file pak34
                                            QString loc34 = "/SM/test2.pak";
                                            QFuture<QString> future34 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc34);
                                            QString pakchunk34 = future34.result();
                                            qDebug() << pakchunk34;
                                            watcher->setFuture(future34);
                                            if (pakchunk34 == "64c77598586b6c3cb60beed0b0750620")
                                            {
                                                qDebug() << "OK";
                                                file_ok++;
                                                ui->label->setText("OK");
                                                ui->label->setStyleSheet("QLabel { color : green; }");
                                            } else if (pakchunk34 == "nofile")
                                            {
                                                qDebug() << "no file found";
                                                ui->label->setText("not found");
                                                ui->label->setStyleSheet("QLabel { color : red; }");
                                            } else
                                            {
                                                qDebug() << "file is diffrent";
                                                ui->label->setText("wrong");
                                                ui->label->setStyleSheet("QLabel { color : red; }");
                                            }
                                        
                                            //file pak35
                                            QString loc35 = "/SM/test3.pak";
                                            QFuture<QString> future35 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc35);
                                            QString pakchunk35 = future35.result();
                                            watcher->setFuture(future35);
                                            qDebug() << pakchunk35;
                                            if (pakchunk35 == "ee53f7a7656a32b5278c460baec46f16")
                                            {
                                                qDebug() << "OK";
                                                file_ok++;
                                                ui->label_7->setText("OK");
                                                ui->label_7->setStyleSheet("QLabel { color : green; }");
                                            } else if (pakchunk35 == "nofile")
                                            {
                                                qDebug() << "no file found";
                                                ui->label_7->setText("not found");
                                                ui->label_7->setStyleSheet("QLabel { color : red; }");
                                            } else
                                            {
                                                qDebug() << "file is diffrent";
                                                ui->label_7->setText("wrong");
                                                ui->label_7->setStyleSheet("QLabel { color : red; }");
                                            }
                                        }
                                        
                                        aha_1980A 1 Reply Last reply 25 Sept 2020, 12:58
                                        0
                                        • S saeid0034
                                          25 Sept 2020, 12:36

                                          @aha_1980 thanks for information
                                          problem is i dont know much about working with slots and QFutureWatcher
                                          can you please say to me i need to do what with this code?

                                          QString Md5_gen(QString const &s)
                                          {
                                              QString pakchunk_Md5;
                                              QCryptographicHash crypto(QCryptographicHash::Md5);
                                              QFile pakchunk(QDir::currentPath() + s);
                                              if (pakchunk.open(QIODevice::ReadOnly))
                                              {
                                                  while(!pakchunk.atEnd()){
                                                  crypto.addData(pakchunk.read(8192));
                                                  }
                                              } else
                                              {
                                                  qDebug() << "Can't open file.";
                                                  pakchunk_Md5 = "nofile";
                                                  return pakchunk_Md5;
                                              }
                                              pakchunk_Md5 = crypto.result().toHex();
                                              return pakchunk_Md5;
                                          }
                                          
                                          MainWindow2::MainWindow2(QWidget *parent) :
                                              QMainWindow(parent),
                                              ui(new Ui::MainWindow2)
                                          {
                                              ui->setupUi(this);
                                          }
                                          
                                          MainWindow2::~MainWindow2()
                                          {
                                              delete ui;
                                          }
                                          
                                          void MainWindow2::on_pushButton_clicked()
                                          {
                                              int file_ok = 0;
                                          
                                              QFutureWatcher<void>* watcher = new QFutureWatcher<void>();
                                              connect(watcher, SIGNAL(finished()), this, SLOT(Md5_gen()));
                                              //file pak33
                                              QString loc33 = "/SM/test.pak";
                                              QFuture<QString> future33 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc33);
                                              QString pakchunk33 = future33.result();
                                              watcher->setFuture(future33);
                                              qDebug() << pakchunk33;
                                              if (pakchunk33 == "f7002d4419cd235a87746715ba6fb2ea")
                                              {
                                                  qDebug() << "OK";
                                                  file_ok++;
                                                  ui->label_8->setText("OK");
                                                  ui->label_8->setStyleSheet("QLabel { color : green; }");
                                              } else if (pakchunk33 == "nofile")
                                              {
                                                  qDebug() << "no file found";
                                                  ui->label_8->setText("not found");
                                                  ui->label_8->setStyleSheet("QLabel { color : red; }");
                                              } else
                                              {
                                                  qDebug() << "file is diffrent";
                                                  ui->label_8->setText("wrong");
                                                  ui->label_8->setStyleSheet("QLabel { color : red; }");
                                              }
                                          
                                              //file pak34
                                              QString loc34 = "/SM/test2.pak";
                                              QFuture<QString> future34 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc34);
                                              QString pakchunk34 = future34.result();
                                              qDebug() << pakchunk34;
                                              watcher->setFuture(future34);
                                              if (pakchunk34 == "64c77598586b6c3cb60beed0b0750620")
                                              {
                                                  qDebug() << "OK";
                                                  file_ok++;
                                                  ui->label->setText("OK");
                                                  ui->label->setStyleSheet("QLabel { color : green; }");
                                              } else if (pakchunk34 == "nofile")
                                              {
                                                  qDebug() << "no file found";
                                                  ui->label->setText("not found");
                                                  ui->label->setStyleSheet("QLabel { color : red; }");
                                              } else
                                              {
                                                  qDebug() << "file is diffrent";
                                                  ui->label->setText("wrong");
                                                  ui->label->setStyleSheet("QLabel { color : red; }");
                                              }
                                          
                                              //file pak35
                                              QString loc35 = "/SM/test3.pak";
                                              QFuture<QString> future35 = QtConcurrent::run(QThreadPool::globalInstance(), Md5_gen, loc35);
                                              QString pakchunk35 = future35.result();
                                              watcher->setFuture(future35);
                                              qDebug() << pakchunk35;
                                              if (pakchunk35 == "ee53f7a7656a32b5278c460baec46f16")
                                              {
                                                  qDebug() << "OK";
                                                  file_ok++;
                                                  ui->label_7->setText("OK");
                                                  ui->label_7->setStyleSheet("QLabel { color : green; }");
                                              } else if (pakchunk35 == "nofile")
                                              {
                                                  qDebug() << "no file found";
                                                  ui->label_7->setText("not found");
                                                  ui->label_7->setStyleSheet("QLabel { color : red; }");
                                              } else
                                              {
                                                  qDebug() << "file is diffrent";
                                                  ui->label_7->setText("wrong");
                                                  ui->label_7->setStyleSheet("QLabel { color : red; }");
                                              }
                                          }
                                          
                                          aha_1980A Offline
                                          aha_1980A Offline
                                          aha_1980
                                          Lifetime Qt Champion
                                          wrote on 25 Sept 2020, 12:58 last edited by
                                          #20

                                          Hi @saeid0034,

                                          see e.g. this example.

                                          Regards

                                          Qt has to stay free or it will die.

                                          S 1 Reply Last reply 25 Sept 2020, 15:46
                                          3

                                          3/31

                                          24 Sept 2020, 19:24

                                          topic:navigator.unread, 28
                                          • Login

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