掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
スレッド処理について (ID:58621)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
#前回の日本語の不味いところは、補って読んで頂くとしてm(_ _)m #外していたら、さらにゴメンなさいだけれども・・・ #しかも、Xp Proですね? でないと以下は全部ハズレです。 シツコクなりますが、↓の理由だと思います。 「ハイパースレッディングテクノロジー」の登場で 潜在的に不具合だったものが、顕在化した。 以下、ここでは ↓とします 「ハイパースレッディングテクノロジー」=「HTテクノロジー」 理由1. 「HTテクノロジー」を搭載しないCPUのときは、 (一見)正常に動いていた。 理由2. 「HTテクノロジー」を搭載するCPUのときは、ダイアログを 閉じるタイミングで、プログラムが落ちる。 不安視してたスレッド中での↓がまずいと思います。 ((Cread_pv_result*)pParam)->OnCancel(); #私もワーカスレッドから、GUIのコントロール等は操作します。 理由 「サブスレッド(←私もこう表現するときもあります)」の中で、 その「スレッド」を生成したダイアログを消滅させようといる。 実際の動作としては「HTテクノロジー」を搭載しないCPUのときは UINT CDlg::ThreadFunc_Main(LPVOID pParam) ↑の関数のコードが全て終了してから、ダイアログ消去の処理が 始まると思いますが、「HTテクノロジー」を搭載するCPUの ときは、即時に始まる可能性があると思うからです。 つまり、スレッドの後処理が終了していない時点で、その後処理 ためのコードがなくなるのだから・・・まずいのでは? それで、対策なのですが・・・ 対策1 てつやさんの方法も一案と思います。 ダイアログ消去までの時間がかせげるので。 対策2 要は、「ワーカスレッド」の処理が終了したことが判明した時点で それから、おもむろにダイアログ消去したいのだと思いますから スレッド終了の判断の一方法を示します。 関数名等が違ったときは変えて、使って下さい。(大雑把ですから) 「CREATE_SUSPENDED」は必ず設定して下さい。 #これも、GUIの方は固まらないと思いましたが(記憶がややあいまい)。 #実はマルチポストですが、質問ではないので、ご了承ください。 static CWinThread *threadHndl = NULL; 中略 BOOL CDlg::OnInitDialog() { #if 0 CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); #endif // ↓は「dwCreateFlags」を設定してませんので、↑を参考に設定して下さい threadHndl = AfxBeginThread((AFX_THREADPROC)ThreadFunc_Main, (void *)this); if (NULL != threadHndl) { // 生成が成功したときのコードですが、今回は無いようです } else { MessageBox("スレッドの作成に失敗しました","報告", MB_OK); return -1; } threadHndl->m_bAutoDelete = FALSE; // CREATE_SUSPENDED を設定してないと threadHndl->ResumeThread(); // 意味がないかも・・・ DWORD exitCode; do { AfxGetThread()->PumpMessage(); ::GetExitCodeThread(threadHndl->m_hThread,&exitCode); } while (STILL_ACTIVE == exitCode); delete threadHndl; threadHndl = NULL; return 0; } 参考資料:「MFCプログラミング」Alan R. Feuer 著 発行所(株)アスキー
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.