
VC++6.0にてAfxBeginThreadで
m_bAutoDelete = TRUEにてスレッドをおこしております。
この終了時に制御関数のwhileループを脱する様にし、
正常にスレッドを終了させているつもりです。
この後、再度(アプリは継続して起動したまま)
AfxBeginThreadにて全く同じ処理で再開すると、
なぜか、前のスレッドが未だ動作しているかのごとく
制御関数内のTRACEが2重に出力されます。
再度、停止し、またスレッド起動すると、
今度は3重になったかの様な動作をします。
スレッドが正しく終了されていないのでは?と思った現象として、
1回起動時にアプリを終了させると正常終了しますが、
2回起動以上は必ずスレッドのメモリーリークが出ます。
メモリーリーク個所はAfxBeginThreadでした。
制御関数内で必要ないとは思いましたが、終了時に
AfxEndThreadを使用しましたが現象は同じでした。
そこで質問です。
1)この現象は、スレッドが正常に終了されていない事に起因しているのでしょうか?
2)スレッドを正しく終了させるにはどうすればいいのでしょうか?
当方、制御関数がループを抜け、さらにm_bAutoDelete = TRUEであれば
オブジェクトも自動的に破棄されると思っていたのですが。。。
以上、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんばんは。
AfxEndThread()で起動した物は「m_pThread->PostThreadMessage(WM_QUIT, 0, 0)」で終了させないといけないらしいです。
http://hp.vector.co.jp/authors/VA014436/prg_memo …
試してみましたが、此れで一応綺麗に終るようです。
CWinThread* m_pThread;
bool m_bSuspend = false;
static UINT Proc(LPVOID pData)
{
MSG msg;
CDlg* p = static_cast<CDlg*>(pData);
p->SetDlgItemText(IDC_EDIT1, "START");
while(::GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
//case WM_QUIT:break;
default:;
}
}
//ココまで来ないといけない
p->SetDlgItemText(IDC_EDIT1, "END");
return 0;
}
void CDlg::OnSwitch()
{
// TODO: この位置にその他の検証用のコードを追加してください
//初めての作成
if(!m_pThread)
{
m_pThread = ::AfxBeginThread(&::Proc, this);
}
else
{
//寝ているスレッドを叩き起こす
if(m_bSuspend)
{
SetDlgItemText(IDC_EDIT1, "RESUME");
m_pThread->ResumeThread();
}
//寝かす
else
{
SetDlgItemText(IDC_EDIT1, "SUSPEND");
m_pThread->SuspendThread();
}
m_bSuspend ^= true;
}
}
void CDlg::OnExit()
{
// TODO: この位置に特別な後処理を追加してください。
if(m_pThread)
{
//寝ているスレッドを叩き起こす(寝ていなければ無視される)
m_pThread->ResumeThread();
m_pThread->PostThreadMessage(WM_QUIT, 0, 0);
m_pThread = 0;
}
}
回答ありがとうございました。
原因は、制御関数内のwhile文を抜ける前に次のスレッドが起動されて
いる様で、そこで前のスレッドが正しく終了していませんでした。
スレッド停止命令後にwaitforsingleobjectにて待機させ、制御関数内のwhile文を抜けた後にseteventする処理手順を踏んだらOKでした。
ありがとうございました。
あと、PostThreadMessage(WM_QUIT, 0, 0)も試してみました。ばっちりでした。勉強になりました。
No.1
- 回答日時:
>1)この現象は、スレッドが正常に終了されていない事に起因しているのでしょうか?
はい。
>2)スレッドを正しく終了させるにはどうすればいいのでしょうか?
>当方、制御関数がループを抜け、さらにm_bAutoDelete = TRUEであれば
>オブジェクトも自動的に破棄されると思っていたのですが。。。
「オブジェクトの破棄」と「オブジェクト内で生成したオブシェクトの破棄」はイコールではありません。
AfxBeginThreadで生成しているスレッド内で作成、もしくは実行しているオブジェクトの終了ミスか、
終了処理は行っていても、スレッド終了時までにその処理が間に合わず残っている可能性はあります。
回答ありがとうございました。
原因は、制御関数内のwhile文を抜ける前に次のスレッドが起動されて
いる様で、そこで前のスレッドが正しく終了していませんでした。
スレッド停止命令後にwaitforsingleobjectにて待機させ、制御関数内のwhile文を抜けた後にseteventする処理手順を踏んだらOKでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
MFCのワーカースレッドとUIスレッドの使い分け
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
[VC++] AfxBeginThreadで生成したスレッドの監視方法について
その他(プログラミング・Web制作)
-
-
4
エディットボックスのフォントを変えたい
C言語・C++・C#
-
5
画面を強制的に再描画させる方法
C言語・C++・C#
-
6
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
7
スレッドの安全な終了のさせ方
C言語・C++・C#
-
8
スレッドの終了の仕方
C言語・C++・C#
-
9
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
10
別スレッドからメインダイアログのコントロールにアクセスする方法
C言語・C++・C#
-
11
CString から LPCTSTRの型に変換
C言語・C++・C#
-
12
AfxBeginThread の引数について
C言語・C++・C#
-
13
WaitForSingleObjectの使い方について
C言語・C++・C#
-
14
CStringをwchar_tに変換したい
C言語・C++・C#
-
15
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
16
CWnd::OnTimerのスレッドの取得
C言語・C++・C#
-
17
MFC モードレスDlgについて
C言語・C++・C#
-
18
ダイアログをスクロールさせるには
C言語・C++・C#
-
19
スレッド処理からダイアログを表示するには?
C言語・C++・C#
-
20
ボタンのオーナードローについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
スレッドにて同一メモリの書き...
-
VB2005 シリアル通信のClose処理
-
待機関数(WaitForMultipleObjec...
-
メモリアクセスの競合について
-
メインダイアログが最背面に表...
-
Windows上で、シグナル(SIGTERM...
-
Macターミナルで実行中のプログ...
-
VBAで別プロセスのExcelのフル...
-
VC++2010 TCPIP通信の受信処理...
-
Mac 乗数の入力方法
-
VB6.0 SHELLで起動...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
VB.netでUSBメモリの固有I...
-
Socket通信の0バイト受信について
-
PostMessageの連続送信
-
小数点を含む数値かどうか判断...
-
ソケットのrecvの戻り値が0
-
ADOでアクセスのレコードに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
複数スレッドを動作させるのに...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
同一スレッドで、ロックをかけ...
-
マルチスレッド内のループについて
-
sleep関数とは?
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
CWnd::OnTimerのスレッドの取得
-
C言語である関数への同時アクセ...
-
別スレッドのデータを受信できない
-
VB2005 シリアル通信のClose処理
-
pthreadの使い方
-
ユーザーインターフェイスの一...
-
Linuxでスレッド優先度って変え...
-
win32 スレッドのハンドルついて
おすすめ情報