- ベストアンサー
クラスでスレッド作成
VC++2008Express WIN32APIでRS232Cの通信用クラスを作成しています。 RS232Cの受信用スレッドを作成して 1ポートの受信処理をするようにはできます。 ですが ポート追加するたびにクラスをインスタンス化して受信用スレッドを 作成したいのですが、スレッド作成するには使用する変数などを staticにしないといけないため、クラスを複数インスタンス化できません。 どのような手法でクラスから複数スレッドを作成することができるのでしょうか? 分かりにくい説明ですが、参考になるものなどありましたら、 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>スレッド作成するには使用する変数などをstaticにしないといけない staticにするのは、Thread関数に渡す、関数ポインタだけで良いのでは? 以下は、ざっくりですが。 class rs232c { public: rs232c(パラメータ色々); Start(); // Thread開始用の関数 private: static unsigned int __stdcall ThreadLoop(void* parm) }; みたいにしといて、 rs232c::Start() { //thisでインスタンスのポインタを渡す _beginthreadex(NULL, 0, rs232c::ThreadLoop, this, 0, NULL); } rs232c::ThreadLoop(void* parm) { // キャストしてインスタンスを使う rs232c* instance = parm; // 受信処理 } int main() { rs232c hoge(パラメータ色々); hoge->Start(); // 受信処理開始 } こんな感じで、いけると思いますよ。
その他の回答 (1)
- axsies
- ベストアンサー率64% (38/59)
staticついてると、プロセス全体で共有されることは避けられないので、他の仕組みを使う必要があります。 No1の方のように、_beginthreadでthisポインタを渡す方法と、 別の方法としてはWin32ならスレッドローカルストレージ(TLS)という仕組みを使う事方法があります。 http://msdn.microsoft.com/ja-jp/library/6yh4a9k1%28v=vs.80%29.aspx http://msdn.microsoft.com/ja-jp/library/2s9wt68x%28v=VS.80%29.aspx http://wisdom.sakura.ne.jp/system/winapi/win32/win148.html VC++限定でよければ、言語拡張の__declspec( thread )をstaticの代わりにを付ければスレッドごとの静的変数をstaticの感覚で容易に実装できると思われます。(私は直接使ったことないので自信はナシ^^;すいません) 1番目、2番目のURLを参考にしてください。 3番目のURLはTLSのAPIを直接使う参考です。 複雑なスレッド管理が必要でなければNo1の方法でも十分で、実際私はあんまり使ったことなかったりしますが。。
お礼
回答ありがとうございました。いろいろな手法あるのですね。まだ、そこまで僕の技量もなく使いこなせそうもありませんが、勉強していきたいと思います。ありがとうございました。
お礼
早々の回答ありがとうござました。サンプルまで教えて頂いて助かりました。なんとなくですが意味理解できました。あまりにもプログラム初心者で無謀な計画ですが頑張りたいと思います。ありがとうございました。