1

さまざまなタイプの多数のハードウェア デバイスが接続されたリアルタイム コントローラ アプリケーションがあります。

すべてのデバイスは多くのコードを共有していますが、それぞれにデバイス タイプ固有のものもあります。新しいタイプのハードウェアで簡単に拡張できるように、このコードを記述しようとしています。

接続された各デバイスには、個別のスレッドで実行されるイベント マネージャー機能が必要です。基本クラスに共通のものを保持したいと思います。それを「デバイス」と呼び、ハードウェア固有のコードを派生クラスに入れます。

そのため、共通のものを使用してデバイスの基本クラスを作成し、イベント マネージャーを純粋仮想にします。次に、各派生クラスがそれを実装します。

次に、システムの起動時に、接続されているすべてのハードウェア デバイスのベクトルを作成し、適切な派生クラスのインスタンスへのポインターをそこにプッシュします。

ここで、ベクター内の各インスタンスに対して boost::thread を開始したいと思います。各スレッドは、ベクター内のそのインスタンスからイベント マネージャー関数を実行する必要があります。

だから私は次のようなことを試みます:

Class Device {
...
    boost::thread thread;
    void manager() = 0;
...
}

Class SpecificDevice1 : public Device {
...
    void manager();
}

SpecificDevice1::manager() {
...do stuff here...
}

Class SpecificDevice2 : public Device {
...
    void manager();
}

SpecificDevice2::manager() {
...do stuff here...
}

Class Config {
...
    std::vector<Device*> devices;
...
}

Config config;
...config.devices get populated with pointers to instances of SpecificDevice1 and SpecificDevice2...

for( auto &device : config.devices ) {
    device->thread = boost::thread( device->manager );
};

私はこれの多くの異なる順列を試しましたが、私はいつも最終的に

エラー: 'boost::thread::thread()' の呼び出しに一致する関数がありません

...たとえデバイスを適切な SpecificDeviceX クラスへのポインタに dynamic_cast しても、同じエラーが発生します。

4

1 に答える 1

3

boost::threadコンストラクターには、関数ポインターと実際のオブジェクトへのインスタンス (thisメンバー関数内のポインター用) が必要です。

この使用のために、スレッド コンストラクターを引数とともに使用できます。

device->thread = boost::thread(&Device::manager, device);

最初の引数はメンバー関数へのポインターで、2 番目の引数は のインスタンスへのポインターですDevice

ただし、これが機能するために行う必要がある別の変更があります。それは、manager関数を作成することvirtualです。適切な関数が呼び出されるためです。

Class Device {
    ...
    boost::thread thread;
    virtual void manager() = 0;
    ...
}

ちなみにC++11対応のコンパイラを使っているので、std::threadできればC++11に変更することをお勧めします。

于 2013-10-04T12:49:29.307 に答える