• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:beginthread 引数)

C++プログラムの引数についての質問

このQ&Aのポイント
  • C++プログラムの引数について質問があります。
  • 具体的な質問内容は、'_beginthread'のエラーメッセージに関してです。
  • エラーメッセージが発生しており、引数の変換に関する問題があるようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

> コンパイルエラーの原因はCPti4Dlgクラスのメンバーはstaticでなないです。 > ret = PtMultiInputEx(m_Id, 4, data)の中で > PtMultiInputEx は ハードウェアメーカは カプセル化関数なんですけど、定義されていないです。。。 定義されていない? DLLやLibで提供されていないということですか … でもボタンのクリックイベントでは使えたんですよね

lysander627
質問者

お礼

すいません。 DLLやLib提供されていますが、コードカプセル化状態です。 UpdateData関数もこの問題です。

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

CWinThreadの派生クラスで AfxBeginThreadで行ったほうがいいかも また 制御関数は CPti4Dlgクラスのメンバーにするなら static関数にする必要があります 一般的には クラス外に定義したグローバル関数を使う手法を使います staticや外部関数にした場合 クラスのメンバーに直接アクセスする手段がなくなるので スレッド起動時の引数に thisポインタなどを与えます また クラスのメンバーへのアクセスですがウィンドウメッセージをRegisterWindowMessageなどで 定義したものを PostMessageなどで投げてやるような仕組みが必要になってきます また受け側のCPti4Dlgクラスのメッセージマップには ON_MESSAGEマクロなどで受け入れ態勢が必要ですが

lysander627
質問者

お礼

どうもありがとうございました。 コンパイルエラーの原因はCPti4Dlgクラスのメンバーはstaticでなないです。 ret = PtMultiInputEx(m_Id, 4, data)の中で PtMultiInputEx は ハードウェアメーカは カプセル化関数なんですけど、定義されていないです。。。 これどうしたらいいですが。。。

lysander627
質問者

補足

redfox63さん言った通りにいろいろ調べましたが、PostMessageたぶん完成できると思います。 ちょっと詳しい直してもらえますか

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>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)
回答No.2

質問内容すら書けない…という状況で自分でデバッグできるのだろーか… 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); ドコに(どのインスタンス)対して実行したらいいんでしょう?

lysander627
質問者

お礼

ご回答ありがとうございました。 質問書いてなかった、すみません。 実際に、これがセンサから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)
回答No.1

超能力を持たない人にも質問がわかるように書いてください.