我有一些记录软件,我用它来捕捉来自多个Point Grey相机,GPS和Phidget传感器的图像。
我使用OpenMP将不同的任务卸载到不同的线程。他们是以下......
当程序运行时,它会显示图像,gps和加速计数据。我点击“L”键,数据记录正常。
我按'x'键将 grabimgs 设置为 false 以退出线程1中的while循环。这会停止正在更新的图像。我希望这也会更新其他线程中的变量,它们也会停止......但它们不会。
这是我不明白的一点,我可以用线程1共享在其他线程(Phidget和GPS数据)中获得的数据。一旦从相机获得新图像,加速度计和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;
}
那么为什么我不能使用grabimgs来指示其他线程停止? 我在Win7 x64,Visual Studio 2010上使用C ++。
答案 0 :(得分:0)
您应该flush
变量将其与其他线程同步:flush(grabimgs)
。