
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で質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別スレッドのデータを受信できない
-
WaitForSingleObjectの使い方に...
-
excelvbaでCreateThreadの動作
-
CWnd::OnTimerのスレッドの取得
-
スレッドの終了の仕方
-
VC++スレッドの正しい終了のさ...
-
DirectX 11のConsntanBuffer
-
スレッドにて同一メモリの書き...
-
C# スレッド終了の監視について
-
C#でスレッド実行中のイベント...
-
マルチスレッドのスレッド数を...
-
VB2005 シリアル通信のClose処理
-
Windows上で、シグナル(SIGTERM...
-
クラスでスレッド作成
-
複数スレッドを動作させるのに...
-
.netアプリへのSendMessageでフ...
-
マルチスレッドプログラミング...
-
ユーザーインターフェイスの一...
-
マルチスレッドでブレイクポイ...
-
スレッドの監視方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
スレッドの終了の仕方
-
WaitForSingleObjectの使い方に...
-
Windows上で、シグナル(SIGTERM...
-
別スレッドのデータを受信できない
-
スレッドの安全な終了のさせ方
-
スレッドにて同一メモリの書き...
-
別スレッドからメインダイアロ...
-
マルチスレッドのスレッド数を...
-
C# スレッド終了の監視について
-
MFC通信プログラムマルチスレッ...
-
Linuxでスレッド優先度って変え...
-
メインダイアログが最背面に表...
-
スレッドの終了はどうやるんで...
-
CWnd::OnTimerのスレッドの取得
-
C# スレッドから親ウィンドウへ...
-
メインスレッドのPostMessageと...
-
msec単位のWait Timerが作れない!
-
.NetのBackgroundWorkerクラス...
おすすめ情報