「MFC マルチスレッド」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==MFC マルチスレッド== [VC++][MFC リストボックスに要素を追加]{{category MFC}} ===ワーカースレッド=== これまで、ファイルの内容…」) |
|||
| (同じ利用者による、間の3版が非表示) | |||
| 1行目: | 1行目: | ||
| − | ==MFC マルチスレッド== | + | ==[[MFC マルチスレッド]]== |
| − | [VC++][MFC リストボックスに要素を追加] | + | [[VC++]] | [[MFC リストボックスに要素を追加]] | [[Category:MFC]] |
===ワーカースレッド=== | ===ワーカースレッド=== | ||
| 37行目: | 37行目: | ||
// | // | ||
//int i = 0; | //int i = 0; | ||
| − | //if (file.Open(fileName, CFile:: | + | //if (file.Open(fileName, CFile::mode[[R]]ead)) { |
// | // | ||
| − | // while(file. | + | // while(file.[[R]]eadString(line)) { |
// m_list_line.AddString(line); | // m_list_line.AddString(line); | ||
| 58行目: | 58行目: | ||
CString fileName; | CString fileName; | ||
| − | dlg- | + | dlg->m_src_file.GetWindowTextA(fileName); |
CStdioFile file; | CStdioFile file; | ||
| 64行目: | 64行目: | ||
int i = 0; | int i = 0; | ||
| − | if (file.Open(fileName, CFile:: | + | if (file.Open(fileName, CFile::mode[[R]]ead)) { |
| − | while(file. | + | while(file.[[R]]eadString(line)) { |
| − | dlg- | + | dlg->m_list_line.AddString(line); |
} | } | ||
| 78行目: | 78行目: | ||
*渡されたパラメータをダイアログにキャストしてあげる | *渡されたパラメータをダイアログにキャストしてあげる | ||
| − | *- | + | *->で、メンバーにアクセスする |
CTextSearchSampleDlg* dlg = (CTextSearchSampleDlg*)pPara; | CTextSearchSampleDlg* dlg = (CTextSearchSampleDlg*)pPara; | ||
| − | dlg- | + | dlg->m_src_file.GetWindowTextA(fileName); |
====完成==== | ====完成==== | ||
非同期に、ファイルを読み込んでリストに追加するアプリケーション完成!? | 非同期に、ファイルを読み込んでリストに追加するアプリケーション完成!? | ||
[[File:0780_mfc_thread_03.jpg]] | [[File:0780_mfc_thread_03.jpg]] | ||
2020年2月16日 (日) 04:29時点における最新版
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 矢木浩人