MFC マルチスレッド
ナビゲーションに移動
検索に移動
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 矢木浩人