使用pthread创建两个类并在cpp中相互访问

时间:2014-07-05 13:03:06

标签: c++ class object pthreads

 #include <pthread.h>

class Controller{
    private:
        int x;
        int y;
    public:
        void Run();
        int getX(){return x;};
        int getY(){return y;};
        int getXSpeed(){return xSpeed;};
        int getYSpeed(){return ySpeed;};
        void setLocation(int x2, int y2);
};

class AutomaticControl {
  private:
    int lastX;
    int lastY;

    Controller contr;
  public:
    AutomaticControl(Controller controller){
        contr = controller;
    }
    void *Run(void);
    static void *Run_helper(void *context){return ((AutomaticControl *)context)->Run();};
};

class Ballsearch {
  private:
    Controller contr;
  public:
    Ballsearch(Controller controller){
        contr = controller;
    };
    void *Run();
    static void *Run_helper(void *context){return ((Ballsearch *)context)->Run();};
};

在我的头文件中提到了三个类:Controller AutomaticControl和Ballsearch。 现在我想创建两个线程:ballsearch.Run()和AutomaticControl.Run() 我在下面的代码中创建了它。 这有效。 我在ballsearch funktion Run()中使用控制器对象。这会改变x和y。 我做完这个之后。还有一个其他线程处于活动状态AutomaticControl Run()函数。 它也使用带有getX()和getY()的控制器对象。 如果我在AutmaticControl中使用它,则没有我期望的值。应该有球搜索函数Run()中提到的值。 我该如何解决这个问题。

以下是cpp中的完整代码:

#include "Header.h"

using namespace std;
using namespace cv;


Controller contr1;

Ballsearch ballsearch(contr1);
AutomaticControl automaticcontr (contr1);


int main(int argc, char *argv[])
{
    Controller contrl;
    contrl.Run();
    return 0;
}



void Controller::Run(){
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1,NULL,&Ballsearch::Run_helper,&ballsearch); // &ballsearch
    pthread_create(&thread2,NULL,&AutomaticControl::Run_helper,&automaticcontr); //&automaticcontr
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    cout << "hello"<<endl;
}


void Controller::setLocation(int x2, int y2){
    x = x2;
    y = y2;
    cout << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl;
    cout  <<  " x-Position:    " << x <<"    y -Position:   " << y <<endl;
    cout << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl;
}


void *Ballsearch::Run() {

    cout << "ballsearch   run" << endl;
    contr.setLocation(20,30);
    delay(3000);
}

void *AutomaticControl::Run() {

    cout << "AutomaticControl  run " << endl;
    cout << "* Start Automatic Control *" << endl;
    delay(1000);
    lastX = contr.getX();
    lastY = contr.getY();

    cout << "-------------------------------------------------------------" << endl;
    cout  <<  " contr.getX()  " << lastX << "    contr.getY()  " << lastY <<endl;
    cout << "-------------------------------------------------------------" << endl;
}

1 个答案:

答案 0 :(得分:0)

我发现了我的错误: 我改变了这个: Ballsearch中的contr->setLocation

然后我改变了这个:

Controller * contr;
AutomaticControl(Controller &controller){
contr = &controller;
}
自动控制和Ballsearch中的

然后我改变了这个:

Ballsearch ballsearch(*this);
AutomaticControl automaticcontr(*this);

在Controller :: Run()函数中;

Controller::Run()功能包括ptread_create