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

MyMemoWiki

「MFC マルチスレッド」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==MFC マルチスレッド== [VC++][MFC リストボックスに要素を追加]{{category MFC}} ===ワーカースレッド=== これまで、ファイルの内容…」)
 
1行目: 1行目:
 
==MFC マルチスレッド==
 
==MFC マルチスレッド==
[VC++][MFC リストボックスに要素を追加]{{category MFC}}
+
[[VC++][MFC リストボックスに要素を追加]]{{category MFC}}
  
 
===ワーカースレッド===
 
===ワーカースレッド===
58行目: 58行目:
 
     CString fileName;
 
     CString fileName;
 
   
 
   
     dlg->m_src_file.GetWindowTextA(fileName);
+
     dlg->m_src_file.GetWindowTextA(fileName);
 
   
 
   
 
     CStdioFile file;
 
     CStdioFile file;
68行目: 68行目:
 
         while(file.ReadString(line)) {
 
         while(file.ReadString(line)) {
 
   
 
   
             dlg->m_list_line.AddString(line);
+
             dlg->m_list_line.AddString(line);
 
   
 
   
 
         }
 
         }
78行目: 78行目:
  
 
*渡されたパラメータをダイアログにキャストしてあげる
 
*渡されたパラメータをダイアログにキャストしてあげる
*->で、メンバーにアクセスする
+
*->で、メンバーにアクセスする
  
 
  CTextSearchSampleDlg* dlg = (CTextSearchSampleDlg*)pPara;
 
  CTextSearchSampleDlg* dlg = (CTextSearchSampleDlg*)pPara;
  dlg->m_src_file.GetWindowTextA(fileName);
+
  dlg->m_src_file.GetWindowTextA(fileName);
 
   
 
   
 
====完成====
 
====完成====
 
非同期に、ファイルを読み込んでリストに追加するアプリケーション完成!?
 
非同期に、ファイルを読み込んでリストに追加するアプリケーション完成!?
 
[[File:0780_mfc_thread_03.jpg]]
 
[[File:0780_mfc_thread_03.jpg]]

2020年2月15日 (土) 08:04時点における版

MFC マルチスレッド

[[VC++][MFC リストボックスに要素を追加]]テンプレート:Category MFC

ワーカースレッド

これまで、ファイルの内容をリストボックスに追加するという意味のないプログラムを作ってきましたが、十分に大きいファイルを読み込んだ場合、読み込み中は画面が固まってしまうので、マルチスレッド化を行う。

以下のシグネチャでコールバックされる関数を書いて呼ぶだけ

UINT __cdecl MyControllingFunction( LPVOID pParam );

コールバックされる関数を書く

宣言の追加

0778 mfc thread 01.jpg 対象のダイアログクラスから、関数の追加ウィザードで、関数を追加

関数の追加ウィザード

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

完成

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