現在、C++ 98 (Linux OS 上) の OpenCV および Boost ライブラリのおかげで、カメラからいくつかの画像を取得するプログラムをコーディングしています。
Boost::thread で OpenCV のおかげで取得を行います。スレッドは、それを起動する Camera クラスで取得した画像を書き込みます。
すべての OpenCv 部分は完全に機能しますが、boost::threads は非常に奇妙なことを行っており、その理由がわかりません。
問題は、スレッド上のメソッドへの ANY 呼び出しが実行をブロックすることです (get_id( ) など)。
以下は単純化されたコードです (ミューテックスとゲッターはコードを軽くするために書かれていません):
class Camera {
private :
bool isRunning_;
boost::thread* acquisitionThread_;
cv::Mat image_;
public :
Camera(){}
void start() {
isRunning_ = true;
acquisitionThread_ = new boost::thread(&Camera::run(), this);
// If i try to call a method on thread_ it blocks.
}
void stop() {
isRunning_ = false;
acquisitionThread_->join();
// For example, join() is blocking the execution.
}
void run() {
while (getIsRunning()) {
// Do some aquisition and write it in image_
}
}
}
int main(int argc, char *argv[])
{
Camera cam;
cam.start();
// Getting the images acquired in the camera class in a loop and display it
cam.stop();
return 0;
}
stop メソッドで結合を削除すると、プログラムは機能しますが、プログラムを最適化する必要があるため、スレッドを完全に制御したいと考えています。それらを適切に管理できないとイライラします。
誰か助けてくれませんか?