- ベストアンサー
C++プログラムの引数についての質問
- C++プログラムの引数について質問があります。
- 具体的な質問内容は、'_beginthread'のエラーメッセージに関してです。
- エラーメッセージが発生しており、引数の変換に関する問題があるようです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> コンパイルエラーの原因はCPti4Dlgクラスのメンバーはstaticでなないです。 > ret = PtMultiInputEx(m_Id, 4, data)の中で > PtMultiInputEx は ハードウェアメーカは カプセル化関数なんですけど、定義されていないです。。。 定義されていない? DLLやLibで提供されていないということですか … でもボタンのクリックイベントでは使えたんですよね
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
CWinThreadの派生クラスで AfxBeginThreadで行ったほうがいいかも また 制御関数は CPti4Dlgクラスのメンバーにするなら static関数にする必要があります 一般的には クラス外に定義したグローバル関数を使う手法を使います staticや外部関数にした場合 クラスのメンバーに直接アクセスする手段がなくなるので スレッド起動時の引数に thisポインタなどを与えます また クラスのメンバーへのアクセスですがウィンドウメッセージをRegisterWindowMessageなどで 定義したものを PostMessageなどで投げてやるような仕組みが必要になってきます また受け側のCPti4Dlgクラスのメッセージマップには ON_MESSAGEマクロなどで受け入れ態勢が必要ですが
お礼
どうもありがとうございました。 コンパイルエラーの原因はCPti4Dlgクラスのメンバーはstaticでなないです。 ret = PtMultiInputEx(m_Id, 4, data)の中で PtMultiInputEx は ハードウェアメーカは カプセル化関数なんですけど、定義されていないです。。。 これどうしたらいいですが。。。
補足
redfox63さん言った通りにいろいろ調べましたが、PostMessageたぶん完成できると思います。 ちょっと詳しい直してもらえますか
- Wr5
- ベストアンサー率53% (2173/4061)
>PtMultiInputEx 関数は ハードウェアメーカで カプセル化した関数です。 で、その関数はスレッドセーフなんですか? # 「スレッドセーフとは」で検索。 # http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%BB%E3%83%BC%E3%83%95 まぁ、実際に走るスレッドが1つだけ…であればとりあえずは大丈夫かもしれませんが……。 >class CPti4Dlg : public CDialog >{float m_Edit_Ch0; >float m_Edit_Ch1; >float m_Edit_Ch2; >float m_Edit_Ch3; } >四つのデータを表示する用edit control box です。 エデットコントロールに紐付いている…んですよね? floatで使えたかはちょっと判りませんが……。 >UpdateData(FALSE) -> データをリアルタイムで出ってます。 でしたら、作成したスレッド関数は1回まわったら抜ける。ではダメかと。 停止に関してはイベントオブジェクトなどでUIスレッドからワーカースレッドに通知するようにして、通知を受けた時点でワーカースレッドが終了するように作る必要があるでしょう。 通知を受けるまではループで回し続ける必要があります。 # とは言え、全力全開で回す必要はないでしょうから適度にSleep()でもかまして下さい。 「スレッド 同期処理」とかで検索してください。 使用例とか見つかるかと思われます。 # あと…スレッド開始したら「Inputボタン」とやらは無効(EnableWindow()など)にしておかないと、複数のスレッドが起動してしまうのでご注意を。 ## スレッドセーフで無かった場合は…ここら辺で不具合が出るかも知れません。 で……… クラスのメンバにアクセスする為にはthisポインタが必要だったハズです。 # それが「どのインスタンスの」という部分です。 現状ではそれを渡していませんのでコンパイル時などにエラーになるかと。 鈴木さん、佐藤さん、田中さんがそれぞれ「連絡帳」を持っています。 先生が「連絡帳に○○を記入して下さい」と指示すれば、ぞれぞれ「自分の連絡帳」に記入するでしょう。 現状では、所有者不明の連絡帳に「記入して」と言っているようなものです。 所有者がいない連絡帳なのか、鈴木さんの連絡帳に記入したらいいのか判りませんよね? ということで、スレッドで動作している関数に何らかの方法でthisポインタを渡す必要があるでしょう。 http://typea.info/tips/wiki.cgi?page=MFC+%A5%DE%A5%EB%A5%C1%A5%B9%A5%EC%A5%C3%A5%C9 とか、参考になりますかね…… # スレッドの起動方法とthisポインタの渡し方、static関数にする。とか…。
- Wr5
- ベストアンサー率53% (2173/4061)
質問内容すら書けない…という状況で自分でデバッグできるのだろーか… C++やMFCはちゃんと使えるワケではないですが…… >error C2664: '_beginthread' : 1 番目の引数を 'void (__thiscall CPti4Dlg::* )(void *)' から 'void (__cdecl *)(void *)' に変換できません。 staticでないメンバ関数をスレッドの開始として使えましたかね? http://d.hatena.ne.jp/kasei_san/20070612/p1 まぁ、呼び出し規約の問題でもあるみたいですが… で、thisポインタも渡せていない状態で… >ret = PtMultiInputEx(m_Id, 4, data); >m_Edit_Ch0 = data[0]; >m_Edit_Ch1 = data[1]; >m_Edit_Ch2 = data[2]; >m_Edit_Ch3 = data[3]; 「どのインスタンスの」メンバ変数なんでしょ? >UpdateData(FALSE); ドコに(どのインスタンス)対して実行したらいいんでしょう?
お礼
ご回答ありがとうございました。 質問書いてなかった、すみません。 実際に、これがセンサから4チャネルデータを読み出すのプログラムです。 PtMultiInputEx 関数は ハードウェアメーカで カプセル化した関数です。 class CPti4Dlg : public CDialog { float m_Edit_Ch0; float m_Edit_Ch1; float m_Edit_Ch2; float m_Edit_Ch3; } 四つのデータを表示する用edit control box です。 UpdateData(FALSE) -> データをリアルタイムで出ってます。 二つのボタンを使いたいです。intput を押して、データを連続的に読み取ります、stopを押して、動作を停止します。 今、threadで使って、問題ある状態で、手伝ってありがとうございました。 もしもっと詳しく直していただければ、幸いでございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
超能力を持たない人にも質問がわかるように書いてください.
お礼
すいません。 DLLやLib提供されていますが、コードカプセル化状態です。 UpdateData関数もこの問題です。