VC++2008Express WIN32APIでRS232Cの通信用クラスを作成しています。
RS232Cの受信用スレッドを作成して
1ポートの受信処理をするようにはできます。
ですが
ポート追加するたびにクラスをインスタンス化して受信用スレッドを
作成したいのですが、スレッド作成するには使用する変数などを
staticにしないといけないため、クラスを複数インスタンス化できません。
どのような手法でクラスから複数スレッドを作成することができるのでしょうか?
分かりにくい説明ですが、参考になるものなどありましたら、
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>スレッド作成するには使用する変数などを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(); // 受信処理開始
}
こんな感じで、いけると思いますよ。
早々の回答ありがとうござました。サンプルまで教えて頂いて助かりました。なんとなくですが意味理解できました。あまりにもプログラム初心者で無謀な計画ですが頑張りたいと思います。ありがとうございました。
No.2
- 回答日時:
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の方法でも十分で、実際私はあんまり使ったことなかったりしますが。。
回答ありがとうございました。いろいろな手法あるのですね。まだ、そこまで僕の技量もなく使いこなせそうもありませんが、勉強していきたいと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドの監視方法について
-
WaitForSingleObjectの使い方に...
-
スレッド内でのマルチスレッド...
-
マルチスレッドプログラムでメ...
-
スレッドにて同一メモリの書き...
-
_beginthreadexで生成したスレ...
-
マルチスレッドについて
-
スレッドの終了の仕方
-
VB2005 シリアル通信のClose処理
-
メインスレッドのPostMessageと...
-
C# スレッドから親ウィンドウへ...
-
VBAで行をコピーして別のシート...
-
スレッドがサスペンドされてい...
-
別スレッドからメインダイアロ...
-
Windows上で、シグナル(SIGTERM...
-
static変数について
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
C# シリアル通信でデータ受信...
-
緯度、経度の 10進法と 60進法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
スレッドの安全な終了のさせ方
-
スレッドの監視方法について
-
スレッドにて同一メモリの書き...
-
別スレッドのデータを受信できない
-
スレッドの終了はどうやるんで...
-
同一スレッドで、ロックをかけ...
-
スレッドの終了の仕方
-
別スレッドからメインダイアロ...
-
_beginthreadexで生成したスレ...
-
待機関数(WaitForMultipleObjec...
-
VB2005 シリアル通信のClose処理
-
マルチスレッドについて
-
Linuxでスレッド優先度って変え...
-
msec単位のWait Timerが作れない!
-
自作クラスのイベントを外部ハ...
-
スレッド一覧の取得
-
C# スレッドから親ウィンドウへ...
おすすめ情報