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. I Need Some Help With QtConcurrent On Mac

I Need Some Help With QtConcurrent On Mac

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 4 Posters 1.3k 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.
  • T TheCRV

    Hello,

    I have a Windows program that I am trying to port over to MacOS, however I am having some trouble with QtConcurrent. Here is my code:

    void MainWindow::on_pushButton_prepareChecksum01_clicked()
    {
        if(ui->radioButton_useTree01->isChecked())
        {
            m_selectedFiles01.clear();
            m_selectedDirectories01.clear();
            m_checkProxy->checkedState()->checkedLeafSourceModelIndexes(m_selectedFiles01);
            m_checkProxy->checkedState()->checkedBranchSourceModelIndexes(m_selectedDirectories01);
    
            if (m_selectedFiles01.isEmpty() && m_selectedDirectories01.isEmpty())
            {
                QMessageBox::information(this, "Nothing Is Selected",
                                         "No files or directories are selected. Please select a file or directory.");
                return;
            }
    
            prepareChecksumDisplay01();
            QGuiApplication::setOverrideCursor(Qt::WaitCursor);
            m_prepareForChecksum01 = QtConcurrent::map(this, &MainWindow::treeChecksum01);
            m_watcher02.setFuture(m_prepareForChecksum01);
        }
    
        if(ui->radioButton_useBrowse01->isChecked())
        {
            if (m_browsedDirs01.isEmpty() && m_browsedFiles01.isEmpty())
            {
                QMessageBox::information(this, "Nothing Is Selected",
                                         "No directories or files have been added. Please add a directory or file.");
                return;
            }
    
            prepareChecksumDisplay01();
            QGuiApplication::setOverrideCursor(Qt::WaitCursor);
            m_prepareForChecksum01 = QtConcurrent::map(this, &MainWindow::browseChecksum01);
            m_watcher02.setFuture(m_prepareForChecksum01);
        }
    }
    
    

    On Windows I was able to use QtConcurrent::run, but this gives me an error on MacOS. Currently, the error is:

    /Users/crv/Documents/Programming/C++/Qt/Checksum1/Checksum1-V1.0-master/mainwindow.cpp:552: error: member reference type 'MainWindow *' is a pointer; did you mean to use '->'?

    I have tried using this->MainWindow::treeChecksum01 and ->treeChecksum01, but both won't compile. Any help would be appreciated. I am using a 2023 MacBook Pro with the latest LTS version of Qt.

    jsulmJ Online
    jsulmJ Online
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #2

    @TheCRV Which line causes this error?

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

    T 1 Reply Last reply
    0
    • jsulmJ jsulm

      @TheCRV Which line causes this error?

      T Offline
      T Offline
      TheCRV
      wrote on last edited by
      #3

      @jsulm Thanks for your reply. The following lines cause my error:

      m_prepareForChecksum01 = QtConcurrent::map(this, &MainWindow::treeChecksum01);
      
      m_prepareForChecksum01 = QtConcurrent::map(this, &MainWindow::browseChecksum01);
      
      

      Clang is what is giving me the errors. Any help you could provide would be much appreciated.

      jsulmJ 1 Reply Last reply
      0
      • T TheCRV

        @jsulm Thanks for your reply. The following lines cause my error:

        m_prepareForChecksum01 = QtConcurrent::map(this, &MainWindow::treeChecksum01);
        
        m_prepareForChecksum01 = QtConcurrent::map(this, &MainWindow::browseChecksum01);
        
        

        Clang is what is giving me the errors. Any help you could provide would be much appreciated.

        jsulmJ Online
        jsulmJ Online
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #4

        @TheCRV said in I Need Some Help With QtConcurrent On Mac:

        Clang is what is giving me the errors

        When you build your app? Or is it simply the code model in QtCreator complaining?

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

        T 1 Reply Last reply
        1
        • jsulmJ jsulm

          @TheCRV said in I Need Some Help With QtConcurrent On Mac:

          Clang is what is giving me the errors

          When you build your app? Or is it simply the code model in QtCreator complaining?

          T Offline
          T Offline
          TheCRV
          wrote on last edited by
          #5

          @jsulm Yes, it gives me the errors when I compile. The code model doesn't complain.

          Christian EhrlicherC 1 Reply Last reply
          0
          • T TheCRV

            @jsulm Yes, it gives me the errors when I compile. The code model doesn't complain.

            Christian EhrlicherC Online
            Christian EhrlicherC Online
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #6

            @TheCRV Of what type is m_prepareForChecksum01 and treeChecksum01/browseChecksum01?

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            T 1 Reply Last reply
            1
            • Christian EhrlicherC Christian Ehrlicher

              @TheCRV Of what type is m_prepareForChecksum01 and treeChecksum01/browseChecksum01?

              T Offline
              T Offline
              TheCRV
              wrote on last edited by
              #7

              @Christian-Ehrlicher m_prepareForChecksum01 is a QFuture<Void>, and treeChecksum01 and browseChecksum01 are local member functions to MainWindow.

              Christian EhrlicherC 1 Reply Last reply
              0
              • T TheCRV

                @Christian-Ehrlicher m_prepareForChecksum01 is a QFuture<Void>, and treeChecksum01 and browseChecksum01 are local member functions to MainWindow.

                Christian EhrlicherC Online
                Christian EhrlicherC Online
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #8

                @TheCRV said in I Need Some Help With QtConcurrent On Mac:

                d treeChecksum01 and browseChecksum01 are local member functions to MainWindow.

                And what's the signature of those functions?
                Please provide a minimal, compilable example so we can take a look on it - shouldn't be that hard here.

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                T 1 Reply Last reply
                0
                • Christian EhrlicherC Christian Ehrlicher

                  @TheCRV said in I Need Some Help With QtConcurrent On Mac:

                  d treeChecksum01 and browseChecksum01 are local member functions to MainWindow.

                  And what's the signature of those functions?
                  Please provide a minimal, compilable example so we can take a look on it - shouldn't be that hard here.

                  T Offline
                  T Offline
                  TheCRV
                  wrote on last edited by
                  #9

                  @Christian-Ehrlicher Thanks for your help. The signature of those functions are void and they take no parameters. I think that a minimally compilable example might be too much for here, so you can take a look at everything at: https://github.com/TheCRV/Checksum1-V1.0/tree/master

                  Again, I thank everyone for their help.

                  Christian EhrlicherC 1 Reply Last reply
                  0
                  • T TheCRV

                    @Christian-Ehrlicher Thanks for your help. The signature of those functions are void and they take no parameters. I think that a minimally compilable example might be too much for here, so you can take a look at everything at: https://github.com/TheCRV/Checksum1-V1.0/tree/master

                    Again, I thank everyone for their help.

                    Christian EhrlicherC Online
                    Christian EhrlicherC Online
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    @TheCRV Sorry but your code does not match what you've shown here. I don't see why it should be so hard to create a minimal class with a function and a QFuture member so we can check it.

                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                    Visit the Qt Academy at https://academy.qt.io/catalog

                    T 2 Replies Last reply
                    0
                    • Christian EhrlicherC Christian Ehrlicher

                      @TheCRV Sorry but your code does not match what you've shown here. I don't see why it should be so hard to create a minimal class with a function and a QFuture member so we can check it.

                      T Offline
                      T Offline
                      TheCRV
                      wrote on last edited by TheCRV
                      #11

                      @Christian-Ehrlicher Okay, here is some code that gives me the same error:

                      My mainwindow.h file:

                      #ifndef MAINWINDOW_H
                      #define MAINWINDOW_H
                      
                      #include <QMainWindow>
                      #include <QtConcurrent>
                      #include <QFuture>
                      #include <QDebug>
                      
                      QT_BEGIN_NAMESPACE
                      namespace Ui {
                      class MainWindow;
                      }
                      QT_END_NAMESPACE
                      
                      class MainWindow : public QMainWindow
                      {
                          Q_OBJECT
                      
                      public:
                          MainWindow(QWidget *parent = nullptr);
                          ~MainWindow();
                      
                      private:
                          Ui::MainWindow *ui;
                          QVector<int> numbers;
                          QFuture<void> future;
                      
                          void addNumbers1();
                          void addNumbers2();
                      };
                      #endif // MAINWINDOW_H
                      

                      My mainwindow.cpp file:

                      #include "mainwindow.h"
                      #include "ui_mainwindow.h"
                      
                      MainWindow::MainWindow(QWidget *parent)
                          : QMainWindow(parent)
                          , ui(new Ui::MainWindow)
                      {
                          ui->setupUi(this);
                          addNumbers1();
                      }
                      
                      MainWindow::~MainWindow()
                      {
                          delete ui;
                      }
                      
                      
                      void MainWindow::addNumbers1()
                      {
                          future = QtConcurrent::map(this, &MainWindow::addNumbers2);
                      }
                      
                      
                      void MainWindow::addNumbers2()
                      {
                          for(int i = 0; i < 1000; ++i)
                          {
                              numbers.append(i);
                              qDebug() << i;
                          }
                      }
                      
                      

                      My main.cpp file:

                      #include "mainwindow.h"
                      
                      #include <QApplication>
                      #include <QLocale>
                      #include <QTranslator>
                      
                      int main(int argc, char *argv[])
                      {
                          QApplication a(argc, argv);
                      
                          QTranslator translator;
                          const QStringList uiLanguages = QLocale::system().uiLanguages();
                          for (const QString &locale : uiLanguages) {
                              const QString baseName = "Test_" + QLocale(locale).name();
                              if (translator.load(":/i18n/" + baseName)) {
                                  a.installTranslator(&translator);
                                  break;
                              }
                          }
                          MainWindow w;
                          w.show();
                          return a.exec();
                      }
                      

                      Thanks again for any help. I'm pretty sure my problem has something to do with Qt 6, as with Qt 5.x I never had any trouble on Windows.

                      I would be perfectly happy if I could get QtConcurrent::run to work.

                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Christian Ehrlicher

                        @TheCRV Sorry but your code does not match what you've shown here. I don't see why it should be so hard to create a minimal class with a function and a QFuture member so we can check it.

                        T Offline
                        T Offline
                        TheCRV
                        wrote on last edited by
                        #12

                        @Christian-Ehrlicher Okay, I have gotten QtConcurrent::run to work by changing my test code to this:

                        future = QtConcurrent::run(&MainWindow::addNumbers2, this);
                        

                        I am still curious why map didn't work, but we can consider this solved. Thanks again.

                        JonBJ 1 Reply Last reply
                        0
                        • T TheCRV

                          @Christian-Ehrlicher Okay, I have gotten QtConcurrent::run to work by changing my test code to this:

                          future = QtConcurrent::run(&MainWindow::addNumbers2, this);
                          

                          I am still curious why map didn't work, but we can consider this solved. Thanks again.

                          JonBJ Online
                          JonBJ Online
                          JonB
                          wrote on last edited by JonB
                          #13

                          @TheCRV
                          From https://doc.qt.io/qt-6/qtconcurrent.html#map I was wondering which overload you were intending to match in your QtConcurrent::map(this, &MainWindow::addNumbers2)? That page is for Qt6, must be some map() overload was removed from Qt5 which matched yours?

                          You said initially it was a Mac issue that worked on Windows. But now I think you are saying that was Qt5 and now is Qt6? Needs mentioning!

                          Christian EhrlicherC 1 Reply Last reply
                          0
                          • JonBJ JonB

                            @TheCRV
                            From https://doc.qt.io/qt-6/qtconcurrent.html#map I was wondering which overload you were intending to match in your QtConcurrent::map(this, &MainWindow::addNumbers2)? That page is for Qt6, must be some map() overload was removed from Qt5 which matched yours?

                            You said initially it was a Mac issue that worked on Windows. But now I think you are saying that was Qt5 and now is Qt6? Needs mentioning!

                            Christian EhrlicherC Online
                            Christian EhrlicherC Online
                            Christian Ehrlicher
                            Lifetime Qt Champion
                            wrote on last edited by Christian Ehrlicher
                            #14

                            I really wonder whats so hard to provide a minimal example... for sure it's important for the problem to load a translator and init an ui... simply not understandable.

                            Your code does and can not compile with msvc and Qt6 ueither because there is no QtConcurrent::map() which takes those parameters.

                            class Foo : public QObject {
                            public:
                                Foo() {
                                    future = QtConcurrent::map(this, &Foo::addNumbers1);
                                }
                            private:
                                QFuture<void> future;
                                void addNumbers1() {}
                            };
                            
                            int main(int argc, char* argv[]) {
                                QApplication a(argc, argv);
                                Foo foo;
                                return a.exec();
                            }
                            

                            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                            Visit the Qt Academy at https://academy.qt.io/catalog

                            T 1 Reply Last reply
                            1
                            • Christian EhrlicherC Christian Ehrlicher

                              I really wonder whats so hard to provide a minimal example... for sure it's important for the problem to load a translator and init an ui... simply not understandable.

                              Your code does and can not compile with msvc and Qt6 ueither because there is no QtConcurrent::map() which takes those parameters.

                              class Foo : public QObject {
                              public:
                                  Foo() {
                                      future = QtConcurrent::map(this, &Foo::addNumbers1);
                                  }
                              private:
                                  QFuture<void> future;
                                  void addNumbers1() {}
                              };
                              
                              int main(int argc, char* argv[]) {
                                  QApplication a(argc, argv);
                                  Foo foo;
                                  return a.exec();
                              }
                              
                              T Offline
                              T Offline
                              TheCRV
                              wrote on last edited by
                              #15

                              @Christian-Ehrlicher I do apologize for not providing a minimal-enough example. You have showed me how to do so. Thanks again.

                              Christian EhrlicherC 1 Reply Last reply
                              0
                              • T TheCRV has marked this topic as solved on
                              • T TheCRV

                                @Christian-Ehrlicher I do apologize for not providing a minimal-enough example. You have showed me how to do so. Thanks again.

                                Christian EhrlicherC Online
                                Christian EhrlicherC Online
                                Christian Ehrlicher
                                Lifetime Qt Champion
                                wrote on last edited by
                                #16

                                It's not about showing - it's about thinking on how to provide the needed information instead simply copying something together and hope that the others fiddle out what the real problem is. Esp. since this helps to find out the real problem by yourself.

                                So did you solve your problem now?

                                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                Visit the Qt Academy at https://academy.qt.io/catalog

                                T 1 Reply Last reply
                                0
                                • Christian EhrlicherC Christian Ehrlicher

                                  It's not about showing - it's about thinking on how to provide the needed information instead simply copying something together and hope that the others fiddle out what the real problem is. Esp. since this helps to find out the real problem by yourself.

                                  So did you solve your problem now?

                                  T Offline
                                  T Offline
                                  TheCRV
                                  wrote on last edited by
                                  #17

                                  @Christian-Ehrlicher Yes, my problem is solved. I'm having another problem with including openSSL in my app. I will open another post for this.

                                  1 Reply Last reply
                                  0

                                  • Login

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