複数の Point Grey カメラ、GPS、および Phidget センサーから画像をキャプチャするために作成したロギング ソフトウェアがいくつかあります。
OpenMP を使用して、さまざまなタスクをさまざまなスレッドにオフロードしました。彼らは次の...
- スレッド 3 - GPS 値の更新 (構造体に格納)
- スレッド 2 - Phidget 値の更新 (構造体に格納)
- スレッド 1 - GPS 構造体と Phidget 構造体から画像と最新の値を取得する
プログラムを実行すると、画像、GPS、加速度計のデータが正常に表示されます。「L」キーを押すと、データのログが正しく機能します。
問題
「x」キーを押してグラビムをfalseに設定し、スレッド 1 の while ループを終了します。これにより、画像の更新が停止します。これが他のスレッドの変数も更新し、それらも停止することを望んでいました...しかし、そうではありません。
これは私が理解していないビットです。他のスレッド (Phidget および 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++ を使用しています。