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

MyMemoWiki

MFC マルチスレッド

提供: MyMemoWiki
2020年2月16日 (日) 04:29時点におけるPiroto (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

MFC マルチスレッド

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

完成

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