- ベストアンサー
クラスの扱いについて
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クラスであると 指定するのか、などわかりません。 どこに、どういう記述をすればいいか教えてください。
- みんなの回答 (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とします。 ただし、メインスレッドとワーカースレッドは同時に動作するので何らかの排他制御が必要になることもある。
その他の回答 (1)
- akino4
- ベストアンサー率18% (35/185)
スレッドを開始するときに引数でそのクラスへのポインタとか データコンテナつくってそれのポインタ渡してますわたしのばあい あとは。。。。メッセージなげるとか
お礼
ありがとうございました。 クラスのポインタを渡すことで解決しました。
お礼
ありがとうございました。 大変参考になりました。