【问题标题】:Multithreading with boost QT and mingw使用 boost QT 和 mingw 的多线程
【发布时间】:2013-07-30 00:58:18
【问题描述】:

我正在 QT 上使用 C++ (librairie OpenCV) 开发一个运行良好的 GUI。 现在我正在尝试使用 boost 对代码进行多线程处理 我的方法是:

//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:类

Convert_AVItoImage:函数

avitoim:类的实例

然后是属性

这条线也可以。

问题从这一行开始:

 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));

它与上面的方法相同,但在这里我得到了这个错误:

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&)'

和:

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);

工作正常!!!

mingw 找不到我不明白为什么的功能!

请帮忙

【问题讨论】:

  • 我猜container_YUV2yuv 过载了,不是吗?如果是这样,bind 无法自动选择正确的版本,您必须将container_YUV2yuv 显式类型转换为适当的签名。
  • 感谢您的评论,不,它没有超载!当我添加到 .pro 文件 -c++0x 时它已解决 :)
  • 所以你真的试图打电话给std::bind?显然,它仅在 c++11 中可用。我的印象是你的意思是boost::bind
  • C++ 中没有任何“默认值”。函数名查找规则比较复杂:gotw.ca/gotw/030.htm

标签: c++ qt boost mingw boost-bind


【解决方案1】:

我认为问题是您不能输入如此匹配的参数。 我建议你使用 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;
}

在这个例子中,我把所有可能的多线程选项都放入了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多