![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- 英語 英語の相の種類 Wikipediaでは He began to talk.(起動相) He cont 1 2023/06/26 11:54
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- BTOパソコン 数時間使用しない状態からPCを起動に失敗後、 自動修復画面で再起動をすると正常に動き出す 3 2022/09/26 22:01
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- デスクトップパソコン windows7を使っているパソコンでの質問です。先日動作が遅く再起動かけると「windowsを起動 9 2022/06/16 21:31
- 日本語 「2014年に終了」「2014年で終了」「2014年をもって終了」の違い 8 2022/11/28 20:08
- 一眼レフカメラ カメラの電源がoffにしても電源が切れない。 4 2022/08/01 09:55
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
スレッドの終了はどうやるんですか?
C言語・C++・C#
-
-
4
WaitForSingleObjectの使い方について
C言語・C++・C#
-
5
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
6
CStringをwchar_tに変換したい
C言語・C++・C#
-
7
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
8
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
9
AfxBeginThread の引数について
C言語・C++・C#
-
10
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
11
スレッドの安全な終了のさせ方
C言語・C++・C#
-
12
MFCでOnPaintのタイミング
C言語・C++・C#
-
13
MFC ダイアログ上のID取得について
C言語・C++・C#
-
14
[VC++] AfxBeginThreadで生成したスレッドの監視方法について
その他(プログラミング・Web制作)
-
15
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
16
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
17
CloseHandle()
C言語・C++・C#
-
18
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
19
起動後直に実行するコードはどこに?
C言語・C++・C#
-
20
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同一スレッドで、ロックをかけ...
-
excelvbaでCreateThreadの動作
-
特定のスレッドの破棄
-
複数スレッドを動作させるのに...
-
VC++スレッドの正しい終了のさ...
-
マルチスレッドの実行順序の制御
-
WaitForSingleObjectの使い方に...
-
MFCマルチスレッドについて
-
.NetのBackgroundWorkerクラス...
-
Linuxでスレッド優先度って変え...
-
CWnd::OnTimerのスレッドの取得
-
スレッドの監視方法について
-
volatile の使い方
-
LinuxでDoEvents()同等機能
-
C#でスレッド実行中のイベント...
-
スレッドについて
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
バックグラウンドのプロセスの...
-
VBAの配列サイズとメモリに関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
Windows上で、シグナル(SIGTERM...
-
マルチスレッドプログラミング...
-
スレッドの終了の仕方
-
スレッドにて同一メモリの書き...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
スレッドでWM_TIMERを受け取れない
-
同一スレッドで、ロックをかけ...
-
マルチスレッドのスレッド数を...
-
WaitForMultipleObjectのイベン...
-
MFC通信プログラムマルチスレッ...
-
pthread_cond_wait 取りこぼし?
-
【VC++6.0(MFC)】スレッドの呼...
-
待機関数(WaitForMultipleObjec...
-
LinuxでDoEvents()同等機能
-
CWnd::OnTimerのスレッドの取得
おすすめ情報