c++multithreadingboost

"too few arguments to function" in boost thread


I am trying to develop a stereoscopic vision system. I am receiving the messages below whenever I try to build my code:

   ***** Build of configuration Debug for project RicoCameraCpp ****

    make all 
    Building file: ../main.cpp
    Invoking: Cross G++ Compiler
    g++ -I/home/ux/Downloads -I/usr/local/boost_1_52_0/boost -I/usr/local/boost_1_52_0 -    I/home/ux/Downloads/opencv2 -include/home/ux/Downloads/opencv2/opencv_modules.hpp -include/usr/local/boost_1_52_0/boost/thread.hpp -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
In file included from /usr/local/boost_1_52_0/boost/thread/thread.hpp:22:0,
                 from /usr/local/boost_1_52_0/boost/thread.hpp:13,
                 from <command-line>:0:
/usr/local/boost_1_52_0/boost/thread/detail/thread.hpp: In member function ‘void boost::detail::thread_data<F>::run() [with F = int (*)(int, char**)]’:
../main.cpp:81:1:   instantiated from here
    /usr/local/boost_1_52_0/boost/thread/detail/thread.hpp:78:17: error: too few arguments to function
    /usr/local/boost_1_52_0/boost/system/error_code.hpp: At global scope:
    /usr/local/boost_1_52_0/boost/system/error_code.hpp:214:36: warning: ‘boost::system::posix_category’ defined but not used [-Wunused-variable]
    /usr/local/boost_1_52_0/boost/system/error_code.hpp:215:36: warning:     ‘boost::system::errno_ecat’ defined but not used [-Wunused-variable]
    /usr/local/boost_1_52_0/boost/system/error_code.hpp:216:36: warning:     ‘boost::system::native_ecat’ defined but not used [-Wunused-variable]
    make: *** [main.o] Error 1

    **** Build Finished *****

Here's my code:

#include "cstdlib"
#include "cmath"
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include "boost/thread.hpp"
#include <iostream>

using namespace std;
using namespace boost;
using namespace cv;

int firstCam( int argc, char** argv )
{
    //initilize first camera
    CvCapture* captureRightCam = cvCaptureFromCAM(0);

    //check if first camera is available
    if(!captureRightCam)
        {
        cout << "No first camera to capture\n";
            return(-1);
        }

    //create right window
    cvNamedWindow( "Right Cam", CV_WINDOW_AUTOSIZE );

    //display frames for every cvWaitKey duration
    while ( 1 )
        {
            //get frames
        IplImage* rightFrame = cvQueryFrame( captureRightCam );

        //check if captured
        if ( !rightFrame )
        {
            fprintf( stderr, "ERROR: frame is null...\n" );
            getchar();
            break;
        }
        //show frames inside the windows
        cvShowImage( "Right Cam", rightFrame );
        cvWaitKey(150);
    }
//release and destroy windows
cvReleaseCapture( &captureRightCam );
cvDestroyWindow( "Right Cam" );
return 0;
}

int secondCam( int argc, char** argv )
{
CvCapture* captureLeftCam = cvCaptureFromCAM(1);
if(!captureLeftCam)
    {
        cout << "No second camera to capture\n";
        return(-1);
    }
cvNamedWindow( "Left Cam", CV_WINDOW_AUTOSIZE );
while ( 1 )
    {
        IplImage* leftFrame = cvQueryFrame( captureLeftCam );
        if ( !leftFrame )
        {
            fprintf( stderr, "ERROR: frame is null...\n" );
            getchar();
            break;
        }
        cvShowImage( "Left Cam", leftFrame );
        cvWaitKey(150);
    }
cvReleaseCapture( &captureLeftCam );
cvDestroyWindow( "Left Cam" );
return 0;
}

int main()
{
boost::thread t1(firstCam);
boost::thread t2(secondCam);
return 0;
}

What am I doing wrong?


Solution

  • I think the error message is very descriptive, actually:

    You are trying to make a thread out of your function firstCam. That function takes two arguments, but when you create your thread, you don't give it any arguments. It therefore can't figure out what arguments to pass to your function and therefore complains about "too few arguments".

    In this case, it seems that you copied the function signatures from somewhere without giving it any thought. You never use argc and argv at all.

    (As a side note:

    using namespace std;
    using namespace boost;
    using namespace cv;
    

    is a bad idea and will get you into trouble sooner or later. See GotW 53 for details.)