「MFC マルチスレッド」の版間の差分
ナビゲーションに移動
検索に移動
1行目: | 1行目: | ||
==MFC マルチスレッド== | ==MFC マルチスレッド== | ||
− | [[VC++]][[MFC リストボックスに要素を追加]]{{category MFC}} | + | [[VC++]] | [[MFC リストボックスに要素を追加]] | {{category MFC}} |
===ワーカースレッド=== | ===ワーカースレッド=== |
2020年2月15日 (土) 08:37時点における版
MFC マルチスレッド
VC++ | MFC リストボックスに要素を追加 | テンプレート:Category MFC
ワーカースレッド
これまで、ファイルの内容をリストボックスに追加するという意味のないプログラムを作ってきましたが、十分に大きいファイルを読み込んだ場合、読み込み中は画面が固まってしまうので、マルチスレッド化を行う。
以下のシグネチャでコールバックされる関数を書いて呼ぶだけ
UINT __cdecl MyControllingFunction( LPVOID pParam );
コールバックされる関数を書く
宣言の追加
対象のダイアログクラスから、関数の追加ウィザードで、関数を追加
関数の追加ウィザード
- 【注意】メンバー関数とする場合、staticとすること。
コーディング
- ボタンのイベントハンドラに直接書いていた処理を、追加した関数に移動し、ワーカースレッド作成の記述を追加。
AfxBeginThread(LoadLine, (LPVOID)this);
- パラメータとして、ダイアログのポインタを渡して、関数内から操作する。
void CTextSearchSampleDlg::OnBnClickedOk() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 //OnOK(); //CString fileName; //m_src_file.GetWindowTextA(fileName); //CStdioFile file; //CString line; // //int i = 0; //if (file.Open(fileName, CFile::modeRead)) { // // while(file.ReadString(line)) { // m_list_line.AddString(line); // } // file.Close(); //} AfxBeginThread(LoadLine, (LPVOID)this); }
↓実装を移動
UINT CTextSearchSampleDlg::LoadLine(LPVOID pPara) { CTextSearchSampleDlg* dlg = (CTextSearchSampleDlg*)pPara; CString fileName; dlg->m_src_file.GetWindowTextA(fileName); CStdioFile file; CString line; int i = 0; if (file.Open(fileName, CFile::modeRead)) { while(file.ReadString(line)) { dlg->m_list_line.AddString(line); } file.Close(); } return 0; }
- 渡されたパラメータをダイアログにキャストしてあげる
- ->で、メンバーにアクセスする
CTextSearchSampleDlg* dlg = (CTextSearchSampleDlg*)pPara; dlg->m_src_file.GetWindowTextA(fileName);
完成
© 2006 矢木浩人