トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

MFC マルチスレッド



目次



記事一覧

キーワード

MFC マルチスレッド

[VC++][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);

完成

非同期に、ファイルを読み込んでリストに追加するアプリケーション完成!?



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.