2016-09-11 23 views
0

ここでは私のmain.cppにコードです:C++仮想関数とスレッド

#include <opencv2/opencv.hpp> 
using std::string; 

#include "caffe_thread_learn.hpp" 

class VideoCaptureTest : public InternalThread { 
public: 
    string video; 
    explicit VideoCaptureTest(string v) : video(v) { StartInternalThread(); } 
protected: 
    virtual void InternalThreadEntry(); 
}; 

void VideoCaptureTest::InternalThreadEntry(){ 
    std::cout << "video child" << std::endl; 
} 

int main(){ 

    InternalThread* vt = new VideoCaptureTest("/Users/zj-db0655/Documents/data/528100078_5768b1b1764438418.mp4"); 
    delete vt; 

    return 0; 
} 

caffe_thread.cppコード:

#include "caffe_thread_learn.hpp" 


InternalThread::~InternalThread() { 
    StopInternalThread(); 
} 

bool InternalThread::is_started() const { 
    return thread_ && thread_->joinable(); 
} 

bool InternalThread::must_stop() { 
    return thread_ && thread_->interruption_requested(); 
} 

void InternalThread::StopInternalThread() { 
    if (is_started()) { 
     thread_->interrupt(); 
     try { 
      thread_->join(); 
     } catch (boost::thread_interrupted&) { 
     } catch (std::exception& e) { 
      std::cout << "Thread exception: " << e.what(); 
     } 
    } 
} 


void InternalThread::StartInternalThread() { 
    thread_.reset(new boost::thread(&InternalThread::entry, this)); 
} 

void InternalThread::entry() { 
    InternalThreadEntry(); 
} 

caffe_thread.hppコード実際

#ifndef caffe_thread_learn_hpp 
#define caffe_thread_learn_hpp 

#include <stdio.h> 

#include <boost/thread.hpp> 
#include <boost/shared_ptr.hpp> 

namespace boost { class thread; } 

class InternalThread { 
public: 
    InternalThread() : thread_() {} 
    virtual ~InternalThread(); 

    /** 
    * Caffe's thread local state will be initialized using the current 
    * thread values, e.g. device id, solver index etc. The random seed 
    * is initialized using caffe_rng_rand. 
    */ 
    void StartInternalThread(); 

    /** Will not return until the internal thread has exited. */ 
    void StopInternalThread(); 

    bool is_started() const; 

protected: 
    /* Implement this method in your subclass 
    with the code you want your thread to run. */ 
    virtual void InternalThreadEntry() { std::cout << "parent" << std::endl; } 
    virtual void fun() {} 

    /* Should be tested when running loops to exit when requested. */ 
    bool must_stop(); 

private: 
    void entry(); 

    boost::shared_ptr<boost::thread> thread_; 
}; 

#endif /* caffe_thread_learn_hpp */ 

、出力:parant

ただし、 nkの出力は次のようにする必要があります。 VideoCaptureTestのStartInternalThreadが呼び出されると、パラメータ(& InternalThread :: entry、this)を持つ新しいスレッドになります。このVideoCaptureTestへのポインタはVideoCaptureTestのInternalThreadEntryを呼び出し、ビデオの子を出力します。ただし、それは親を出力します。

ありがとうございます!

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

1

これはスレッド間のタイミングの問題です。新しいVideoCaptureTestオブジェクトを作成してすぐに削除してから、StartInternalThreadで作成したスレッドで実行することができます。デストラクタが呼び出されると、オブジェクトは出力が生成される前にオブジェクトInternalThreadに分解されます。

メイン/メイン間でスリープ状態にするか、スレッドを終了するまで待ってから破棄してください。

+0

すごく感謝!できます! – ScutterKey