C/C++でやっています。
boost::thread をクラス化して使いやすくしようとしています。
サイトを参考にしながら自分なりにやってみました。
本当は TemplateMethodパターン適用で、
IThreadインターフェースクラス ( 自作 ) を定義してライブラリ化し、
使うときは
IThreadを継承して Mainメンバ関数を実装すればいい ( 他の独自のメンバ関数はオプションとして。 ) という風にしたいのですが、
調べても なかなかヒットしません。
[C++] スレッドからのコールバック│miscellaneous
のようにクラス化しているのもありますが、そのクラスのみで完結しています。
それ自体はいいですが、毎回boost::threadを手動で呼び出して...
としないといけないので...
探しながら考えてみると「関数オブジェクト」がありましたね。
クラスオブジェクトでありながら、operator() をオーバーロードしているので、関数のように使えるっていう。
なので、スレッド用クラスと スレッド操作クラスを別にしました。
[ CThreadManager ] + CONSTRUCTOR( func : boost::function<void (void)> ... ) + DESTRUCTOR() + Join( void ) : void [ throw(CExceptionEx) ] + Detach( void ) : void [ throw(CExceptionEx) ] ...
という風にboost::threadを( namespace THREAD = boost::thread のような感覚で) 簡単にしたような感じにしました。
( 上はあくまでイメージ )
CExceptionEx というのは std::exception を継承して生成した独自の例外クラスとします。
引数は
CExceptionEx( メッセージ, エラー番号 = -1 );
としています。
( 字数制限のため )
リンク/インクルードともに出来ています。
方法1 ではうまくいくのですが、方法2 で試すと Th.Interrupt(); が無視されたような状態になります。
つまり、遅延生成をするとInterruptメンバ関数が無視状態。
どういう風にすればいいのでしょうか?
やはり、遅延は諦めるべきでしょうか?
[参考にしたサイト]
- "boost::threadを使って、クラス内でスレッドを作ってみる - いんちょき通信"
- "スレッドの終了を考える - gununuの日記"
- [C++] スレッドからのコールバック│miscellaneous
- "スレッド - boostjp"
[情報]
言語 : C/C++
ライブラリ: Boost
コンパイラ: MinGW
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/01 04:10