電子書籍の厳選無料作品が豊富!

VC++2008Express WIN32APIでRS232Cの通信用クラスを作成しています。
RS232Cの受信用スレッドを作成して
1ポートの受信処理をするようにはできます。
ですが
ポート追加するたびにクラスをインスタンス化して受信用スレッドを
作成したいのですが、スレッド作成するには使用する変数などを
staticにしないといけないため、クラスを複数インスタンス化できません。
どのような手法でクラスから複数スレッドを作成することができるのでしょうか?
分かりにくい説明ですが、参考になるものなどありましたら、
よろしくお願いします。

A 回答 (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(); // 受信処理開始
}
こんな感じで、いけると思いますよ。
    • good
    • 0
この回答へのお礼

早々の回答ありがとうござました。サンプルまで教えて頂いて助かりました。なんとなくですが意味理解できました。あまりにもプログラム初心者で無謀な計画ですが頑張りたいと思います。ありがとうございました。

お礼日時:2011/09/28 10:28

staticついてると、プロセス全体で共有されることは避けられないので、他の仕組みを使う必要があります。


No1の方のように、_beginthreadでthisポインタを渡す方法と、
別の方法としてはWin32ならスレッドローカルストレージ(TLS)という仕組みを使う事方法があります。

http://msdn.microsoft.com/ja-jp/library/6yh4a9k1 …
http://msdn.microsoft.com/ja-jp/library/2s9wt68x …
http://wisdom.sakura.ne.jp/system/winapi/win32/w …

VC++限定でよければ、言語拡張の__declspec( thread )をstaticの代わりにを付ければスレッドごとの静的変数をstaticの感覚で容易に実装できると思われます。(私は直接使ったことないので自信はナシ^^;すいません)
1番目、2番目のURLを参考にしてください。
3番目のURLはTLSのAPIを直接使う参考です。

複雑なスレッド管理が必要でなければNo1の方法でも十分で、実際私はあんまり使ったことなかったりしますが。。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。いろいろな手法あるのですね。まだ、そこまで僕の技量もなく使いこなせそうもありませんが、勉強していきたいと思います。ありがとうございました。

お礼日時:2011/09/28 10:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!