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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
WaitForSingleObjectの使い方について
C言語・C++・C#
-
-
4
スレッドの終了はどうやるんですか?
C言語・C++・C#
-
5
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
6
[VC++] AfxBeginThreadで生成したスレッドの監視方法について
その他(プログラミング・Web制作)
-
7
MFCでOnPaintのタイミング
C言語・C++・C#
-
8
スレッドの安全な終了のさせ方
C言語・C++・C#
-
9
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
10
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
11
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
12
CStringをwchar_tに変換したい
C言語・C++・C#
-
13
CString から LPCTSTRの型に変換
C言語・C++・C#
-
14
MFC通信プログラムマルチスレッドで例外スロー
C言語・C++・C#
-
15
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
16
AfxBeginThread の引数について
C言語・C++・C#
-
17
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
18
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
19
MFCのワーカースレッドとUIスレッドの使い分け
C言語・C++・C#
-
20
起動時に何のダイアログも表示されない
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
MFC通信プログラムマルチスレッ...
-
スレッドにて同一メモリの書き...
-
マルチスレッドについて
-
自作クラスのイベントを外部ハ...
-
ユーザーインターフェイスの一...
-
.netアプリへのSendMessageでフ...
-
特定のスレッドの破棄
-
C++ GUIのメッセージループ。
-
マルチスレッドプログラムでメ...
-
excelvbaでCreateThreadの動作
-
スレッドの終了の仕方
-
msec単位のWait Timerが作れない!
-
別スレッドとイベントの終了手...
-
スレッドの終了はどうやるんで...
-
Linuxでスレッド優先度って変え...
-
_beginthreadexについて
-
DirectX LPDIRECT3DDEVICE9のマ...
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの終了はどうやるんで...
-
VB2005 シリアル通信のClose処理
-
マルチスレッドプログラミング...
-
.netアプリへのSendMessageでフ...
-
マルチスレッドについて
-
Linuxでスレッド優先度って変え...
-
Win32APIでのスレッド処理
-
pthread_cond_wait 取りこぼし?
-
LinuxでDoEvents()同等機能
-
C++ GUIのメッセージループ。
-
excelvbaでCreateThreadの動作
-
マルチスレッドの実行順序の制御
-
同一スレッドで、ロックをかけ...
おすすめ情報