• ベストアンサー

クラスの扱いについて

VCで簡単なプログラムを造っています。 ダイアログベースです。 エディットボックスへのアクセス方法がわかりません。 識者の方、ご教授願います。 簡単にソースを載せます。 以下は、ボタンを押した時に動作するルーチンです。 void CTestDialog::OnButton1() { CreateThread(, , Sub, , ,); } Sub() が作成されたスレッドで動作する関数です。 void Sub() { CString csText; csText.Format("てすと"); SetDlgItemText(IDC_EDIT1, csText); } IDC_EDIT1 が CTestDialogクラスのエディットボックスです。 Sub() の中でこのエディットボックスに書きたい。 Sub() を CTestDialogクラスとして定義するのか、または SetDlgItemText関数で IDC_EDIT1 が CTestDialogクラスであると 指定するのか、などわかりません。 どこに、どういう記述をすればいいか教えてください。

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 akino4さんが言われるようにわたしも、引数としてthis(自分自身という意味)を渡します。 ワーカースレッドは、同じクラス内でも別領域になってしまうからです。 下記に簡単な例を載せます、参考にしてください。 ※CreateThreadの代わりにAfxBeginThreadを使用するようにしましょう。 ※テキストボックスを前もってCString型のメンバ変数(m_text)としておきます。 long CAbc::test() { CWinThread* wkpThread=NULL; wkpThread = AfxBeginThread( CAbc::m_Thread, this ); return 0; } UINT CAbc::m_Thread( LPVOID n ) { CAbc* wkThis; wkThis = (CAbc *)n; n->m_text = "テストだよ!!"; return 0; } 他のメンバ関数やメンバ変数を使う場合もn->xxxxxxとします。 ただし、メインスレッドとワーカースレッドは同時に動作するので何らかの排他制御が必要になることもある。

nabezo-
質問者

お礼

ありがとうございました。 大変参考になりました。

その他の回答 (1)

  • akino4
  • ベストアンサー率18% (35/185)
回答No.1

スレッドを開始するときに引数でそのクラスへのポインタとか データコンテナつくってそれのポインタ渡してますわたしのばあい あとは。。。。メッセージなげるとか

nabezo-
質問者

お礼

ありがとうございました。 クラスのポインタを渡すことで解決しました。

関連するQ&A