| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
ページの作成:「==MFC マルチスレッド== [VC++][MFC リストボックスに要素を追加]{{category MFC}} ===ワーカースレッド=== これまで、ファイルの内容…」
==MFC マルチスレッド==
[VC++][MFC リストボックスに要素を追加]{{category MFC}}

===ワーカースレッド===
これまで、ファイルの内容をリストボックスに追加するという意味のないプログラムを作ってきましたが、十分に大きいファイルを読み込んだ場合、読み込み中は画面が固まってしまうので、マルチスレッド化を行う。
*[http://msdn.microsoft.com/ja-jp/library/s3w9x78e(VS.80).aspx AfxBeginThread]

以下のシグネチャでコールバックされる関数を書いて呼ぶだけ
UINT __cdecl MyControllingFunction( LPVOID pParam );

===コールバックされる関数を書く===
====宣言の追加====
[[File:0778_mfc_thread_01.jpg]]
対象のダイアログクラスから、関数の追加ウィザードで、関数を追加

====関数の追加ウィザード====
[[File:0779_mfc_thread_02.jpg]]
上記のシグネチャに合わせて、関数を追加。
*【注意】メンバー関数とする場合、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);

====完成====
非同期に、ファイルを読み込んでリストに追加するアプリケーション完成!?
[[File:0780_mfc_thread_03.jpg]]

案内メニュー