Search code examples
c++qtboostmingwboost-bind

Multithreading with boost QT and mingw


I am developping a GUI using C++ (librairie OpenCV) on QT that works fine. now i am trying to multithread the code using boost my method is :

//creating thread group
 thread_group mythread;
//then creating threads 

    mythread.create_thread(bind(&MainWindow::setbarvalue,this,0) ) ;

//set max and min of a progressbar to zero to get a floatting progressbar


 mythread.create_thread(bind(&AVI2Image::Convert_AVItoImage,&avitoim,Nom,firstframe, lastframe,Nom_save,digitsnumber)) ;

AVI2Image :the class

Convert_AVItoImage: the function

avitoim: instance of the class

then the attributes

this line work either .

the problem begin with this line :

 mythread.create_thread(bind(&Lecture_containerYUV::container_YUV2yuv,&lectcont, Nom,Nom_save, width ,height,Redimonsionne,width_desir,height_desir, filter,inputsampling,
                             inputbitdepth,nbimages,digitsnumber,ry6,ru6,rv6,gy6,gu6,gv6,by6,bu6,bv6,coeff1,coeff2,coeff3,contrast,gamma,ry7,ru7,rv7,gy7,gu7,gv7,by7,bu7
                             ,bv7,ry2,ru2,rv2,gy2,gu2,gv2,by2,bu2,bv2));

its the same method as above but here I get this error:

C:\Users\Mido\Documents\Container_ConverterV_2.4\mainwindow.cpp:363: erreur : no matching function for call to 'bind(void (Lecture_containerYUV::*)(std::string, std::string, int, int, bool, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double), Lecture_containerYUV*, std::string&, std::string&, int&, int&, bool&, int&, int&, int&, int&, int&, int&, int&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&, double&)'

and:

lectcont.container_YUV2yuv( Nom,Nom_save, width ,height,Redimonsionne,width_desir,height_desir, filter,inputsampling,
                             inputbitdepth,nbimages,digitsnumber,ry6,ru6,rv6,gy6,gu6,gv6,by6,bu6,bv6,coeff1,coeff2,coeff3,contrast,gamma,ry7,ru7,rv7,gy7,gu7,gv7,by7,bu7
                             ,bv7,ry2,ru2,rv2,gy2,gu2,gv2,by2,bu2,bv2);

works fine!!!

mingw cant find the function i dont understand why !

any help please


Solution

  • I think issue is that you cant enter so match parameters. I propose that you use the Multithreading of C++11

    MyThread.h

    #ifndef MyTHREAD_HPP
    #define MyTHREAD_HPP
    
    #include <thread>
    #include <mutex>
    
    class MyThread {
    
    
    public:
        MyThread();
        void PrintOutMessage(string msg);
        void PrintOut(int i, int j, int k);
        void PrintOut(int i, int j);
        ~MyThread();
    };
    #endif
    

    MyThread.cpp

    #include "MyThread.hpp"
    
    
    mutex _mu, _mu2;
    
    MyThread::MyThread()
    {
    
    }
    
    
    MyThread::~MyThread()
    {
    }
    
    void MyThread::PrintOutMessage(string msg)
    {
    
        for (int l = 0; l < 10; l++)
        {
    
            lock(_mu, _mu2);
            lock_guard<mutex>locker(_mu2, adopt_lock);
            lock_guard<mutex>locker2(_mu, adopt_lock);
    
            cout<< "message:" << msg << endl;
            Sleep(200);
        }
    
    }
    
    void MyThread::PrintOut(int i,int j,int k)
    {
    
    
        for (int l = 0; l < 10; l++)
        {
            lock(_mu, _mu2);
            //lock_guard<mutex>locker(_mu2, adopt_lock);
            //lock_guard<mutex>locker2(_mu, adopt_lock);
            unique_lock<mutex>locker(_mu2, adopt_lock);
            unique_lock<mutex>locker2(_mu, adopt_lock);
            cout << "message:" << i << ", " << j << ", " << k << endl;
            Sleep(200);
        }
    
    }
    
    void MyThread::PrintOut(int i, int j)
    {
    
    
        for (int l = 0; l < 10; l++)
        {
            lock(_mu, _mu2);
            lock_guard<mutex>locker(_mu2, adopt_lock);
            lock_guard<mutex>locker2(_mu, adopt_lock);
    
            cout << "message:" << i << ", " << j << endl;
            Sleep(200);
        }
    
    }
    

    main.cpp

    #include "MyThread.hpp"
    
    void (MyThread::*memfunc)(int,int) = &MyThread::PrintOut;
    void (MyThread::*memfunc2)(int, int,int) = &MyThread::PrintOut;
    
    void PrintOutmainfunc(int i, int j, int k)
    {
    
    
        for (int l = 0; l < 10; l++)
        {
    
            cout << "message:" << i << ", " << j << ", " << k << endl;
            Sleep(200);
        }
    
    }
    int main (){
    
        string msg = " hello world";
        int i = 10, j = 20, k = 30;
        //  string str = lexical_cast<string>(i);
        //cout << "str: " << str << endl;
    
        MyThread mythread;
    
        thread t1(memfunc, mythread, i, j);
        thread t2(memfunc2, mythread, i, j, k);
        thread t3(&MyThread::PrintOutMessage, mythread, msg);
        //thread t4(PrintOutmainfunc, i, j, k);
    
        //thread t3(bind(&MyThread::PrintOutMessage, mythread, msg));
    
        t1.join();
        t2.join();
        t3.join();
        //t4.join();
    
        system("PAUSE");
        return 0;
    }
    

    in this example I putted all possible options for Multithreading