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

 
108行目: 108行目:
<br><br>
<br><br>


== 注意事項 ==
== 画面の更新 ==
UpdateData(TRUE)およびUpdateData(FALSE)等はマルチスレッド内で呼ぶことができない。<br>
ワーカースレッド内において、<code>UpdateData</code>関数等の画面を描画するような関数は実行することができない。<br>
<br>
<br>
AfxGetMainWnd()の戻り値は、m_pLoadXMLThread->m_pMainWndに渡したウィンドウである。<br>
<code>AfxGetMainWnd</code>関数の戻り値は、m_pLoadXMLThread->m_pMainWndに渡したウィンドウである。<br>
設定しないとNULLが返り、また、ダイアログのCreate関数も呼ぶことができない。<br>
設定しない場合は<code>NULL</code>となり、また、ダイアログの<code>Create</code>関数も呼ぶことができない。<br>
そこで、スレッドの処理と同期してUIを更新する場合(UpdateData(TRUE)をスレッドから同期して呼ぶ場合)は、<br>
<br>
下記のようにスレッド内からメインウィンドウにメッセージを送る。<br>
そのため、ワーカースレッドの処理と同期して画面を更新する場合 (UpdateData(TRUE)をスレッドから同期して実行する場合) は、<br>
以下に示すようにワーカースレッド内からメインウィンドウにメッセージを送信する。<br>
メインウインドウは、メッセージを受信して任意の処理を行う。<br>
<br>
<br>
  <syntaxhighlight lang="cpp">
  <syntaxhighlight lang="cpp">
  // stdafx.h
  // stdafx.hファイル
   
   
  //------------------------------------------------------------------------
  //------------------------------------------------------------------------
126行目: 128行目:
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // CFileView.cpp
  // CFileView.cppファイル
   
   
  // スレッドからメイン処理にメッセージを送る & 受け取って処理
  // まず、ワーカースレッドからメイン処理にメッセージを送信する
// 次に、メッセージを受信して任意の処理を行う
  BEGIN_MESSAGE_MAP(CFileView, CDockablePane)
  BEGIN_MESSAGE_MAP(CFileView, CDockablePane)
     // UserMessage
     // UserMessage
140行目: 143行目:
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // CFileView.h
  // CFileView.hファイル
   
   
  class CFileView
  class CFileView
150行目: 153行目:
<br>
<br>
後は、SendMessage関数を受け取った側で処理を行えばよい。<br>
後は、SendMessage関数を受け取った側で処理を行えばよい。<br>
受け取り側では、UpdateData(TRUE)およびUpdateData(FALSE)等を呼ぶことができる。<br>
受信側では、UpdateData(TRUE)、および、UpdateData(FALSE)等を呼ぶことができる。<br>
<br>
<br>
ここでスレッドを待つWaitForSingleObject関数を使用した場合、デッドロックになるので気をつけること。<br>
<u>この時、スレッドの終了を待機するWaitForSingleObject関数を使用する場合、デッドロックになることに注意する。</u><br>
スレッドの終了時に何らかの処理を行うのであれば、今回のようにスレッド終了時に"メッセージをメインウィンドウへ送る"ことで解決できる。<br>
スレッドの終了時に何らかの処理を行うのであれば、上記のようにスレッド終了時に"メッセージをメインウィンドウへ送信する"ことにより解決できる。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:MFC]]
[[カテゴリ:MFC]]