0

MFC アプリケーションでのメモリ リークを解決できる人はいますか? プログラムは、次のコード ブロックがなくても正常に動作するようです。このブロックには、複数のタスクの条件付き実行と MFC ダイアログ データ メンバーへのデータの受け渡しが含まれ、その後、MFC ダイアログのインジケーターが更新されます。他のテストでは、デバッグ ウィンドウにメモリ リーク メッセージが表示されることを除いて、すべて正常に動作することが示されています。プラットフォーム: WIN 7 64 ビット、MSVC 2011。ありがとう!

#include <vector>
#include <thread> 

//Implementation parallel tasking
void CMASTERDlg::OnCompositeParalleltasking()
{   
const int totTsk=8;
BOOL select[totTsk]={
    m_Parallel_Audio,
    m_Parallel_DDS,
    m_Parallel_HV,
    m_Parallel_Monitor,
    m_Parallel_PDA,
    m_Parallel_Pulnix,
    m_Parallel_Supertime,
    m_Parallel_Temp};

//Put all selected tasks in a thread vector
std::vector<std::thread> threads;
auto pvThread = threads.begin(); 

if (m_Parallel_Audio)
    threads.push_back(std::thread(Audio, 1));
if (m_Parallel_DDS) 
    threads.push_back(std::thread(DDS, 1, 1));
if (m_Parallel_HV) 
    threads.push_back(std::thread(HVgetShow, this, 3));
if (m_Parallel_Monitor) 
    threads.push_back(std::thread(MonitorgetShow, this));
if (m_Parallel_PDA) 
    threads.push_back(std::thread(PDAgetShow, this));
if (m_Parallel_Pulnix) 
    threads.push_back(std::thread(DoNothing, 1));
if (m_Parallel_Supertime) 
    threads.push_back(std::thread(MMCS,Sequence_id, static_cast<LPCSTR>(CStringA(loopnum))));
if (m_Parallel_Temp) 
    threads.push_back(std::thread(TempgetShow,this));

pvThread = threads.begin();
while (pvThread != threads.end())
{
     pvThread->join();
     pvThread++;
}

//update data on front panel
UpdateData(FALSE);
UpdateWindow();


//count selected tasks and output message
int j=0, count=0;
for(j=0; j<totTsk; j++) {
   if (select[j])  count++;
}
char buffer[2];
itoa (count,buffer,10);
string message=string(buffer)+" tasks completed in parallel\n";
TRACE(message.c_str());  //Message in debugging window

}
4

1 に答える 1

0

コード

pvThread = threads.begin();
while (pvThread != threads.end())
{
     pvThread->join();
     pvThread++;
}

私には疑問に思えます。このループに初めて入ったとき、現在のスレッド (メインのアプリケーション UI スレッドであると想定しています) は、最初のスレッドで join() を呼び出すと、そのスレッドが完了するまでブロックされます。最初のスレッドが少なくとも他のいくつかのスレッドよりも時間がかかる場合、最終的には機能していないスレッドで join() を呼び出すことになります。おそらく、これを処理している間にシステムが何かを漏らしていますか?

于 2012-05-10T19:12:42.767 に答える