0

複数の Point Grey カメラ、GPS、および Phidg​​et センサーから画像をキャプチャするために作成したロギング ソフトウェアがいくつかあります。

OpenMP を使用して、さまざまなタスクをさまざまなスレッドにオフロードしました。彼らは次の...

  • スレッド 3 - GPS 値の更新 (構造体に格納)
  • スレッド 2 - Phidg​​et 値の更新 (構造体に格納)
  • スレッド 1 - GPS 構造体と Phidg​​et 構造体から画像と最新の値を取得する

プログラムを実行すると、画像、GPS、加速度計のデータが正常に表示されます。「L」キーを押すと、データのログが正しく機能します。

問題

「x」キーを押してグラビムfalseに設定し、スレッド 1 の while ループを終了します。これにより、画像の更新が停止します。これが他のスレッドの変数も更新し、それらも停止することを望んでいました...しかし、そうではありません。

これは私が理解していないビットです。他のスレッド (Phidg​​et および GPS データ) で取得したデータをスレッド 1 と共有できます。新しい画像がカメラから取得されるとすぐに、加速度計と GPS の最新の値がにダンプされます。ファイル。

int main() {
    //connection flags
    bool cameras_connected  = false;
    bool phidget_connected  = false;
    bool GPS_connected      = false;
    if (cap.ConnectCameras()) {
        cout << "Connected to FireFly cameras" << endl;
        cameras_connected = true;
    } 
    if (GPS.isReady()) { 
        cout << "Connected to GPS" << endl;
        GPS_connected = true;
    }
    if (Phid.connectPhidget()) { 
        cout << "Connected to Phidget" << endl;
        phidget_connected = true;
    }


bool grabimgs = true;
#pragma omp parallel sections shared(GPSData,PhidgetData,grabimgs,cameras_connected,phidget_connected,GPS_connected)
{
    //---- THREAD 1 ----
    // Camera Capture Thread
    #pragma omp section
    {
        while(grabimgs) {
            vector<cv::Mat> Images;
            if(cap.GrabMats(Images)) {
                //do imshow and logging bits
                //GPS and Phidget data is written and displayed from here
                char key = cv::waitKey(1000/30);
                if (key=='x'){
                    grabimgs = false;
                    doLogging = false;
                } 
            }
        }
    }   //END OF THREAD 1

    //---- THREAD 2 ----
    //Phidget Capture Thread
    #pragma omp section
    {
        if (phidget_connected) {
            while(grabimgs) {
                cout << "grabimgs in thread 2 = " << grabimgs << endl;
                //get Phidget data
                Phid.updateReadings(PhidgetData);
            }
        }
    }   //END OF THREAD 2


    //---- THREAD 3 ----
    //GPS Capture Thread
    #pragma omp section
    {
        if(GPS_connected) {
            while(grabimgs) {
                cout << "grabimgs in thread 3 = " << grabimgs << endl;
                //get GPS Data
                GPS.update(GPSData,FORCE_UPDATE);
            }
        }
    }   //END OF THREAD 3
}// end of OMP
return 1;

}

では、グラビムを使用して他のスレッドに停止を指示できないのはなぜですか? Win7 x64、Visual Studio 2010 で C++ を使用しています。

4

1 に答える 1

0

flush変数を他のスレッドと同期する必要があります: flush(grabimgs).

https://computing.llnl.gov/tutorials/openMP/#FLUSHも参照してください。

于 2013-06-04T21:33:54.607 に答える