我是个新手,做c++刚两个月,碰到个棘手的问题,我想做个showTip,用数据驱动的方式做,即底层网络发包线程监视网络得到一个符合条件的数据,就通过一个函数指针调用ui线程创建一个对话框,这个对话框5秒后会消失,我通过一个主对话框去管理它(这个对话框在初始化时时隐藏的),但是发现当showtip被显示时程序就死了,好像是主对话框死锁了,这是为什么?
  这部分是我回调函数的代码,你们帮我看看:
CThreadSection m_HwndLock1;
CThreadSection m_HwndLock;
map<int,SystemTrayDlg*>HwndMap;
typedef struct _ThreadFuncParam
{
MovieInfo*stMovieInfo;
} ThreadFuncParam;
void getinfo(void **info,MovieInfo*stMovieInfo){
*info=stMovieInfo;
}
UINT ThreadFunc(LPVOID lpParam)
{
#if 0
//MessageBox(NULL,TEXT("fun is start"),TEXT("test"),MB_OK);
int m_Tdata(5);
SystemTrayDlg *dlg2=new SystemTrayDlg;
ThreadFuncParam *temp=(ThreadFuncParam*)lpParam;
void*info(NULL);
getinfo(&info,temp->stMovieInfo);
dlg2->set_info(info);
dlg2->Create(IDD_DIALOG_TIPS);
/*void **info;*/

map<int,HWND>::iterator m_iterat;
m_HwndLock.Lock();
for (m_iterat=HwndMap.begin();m_iterat!=HwndMap.end();)
{
if (::IsWindow(m_iterat->second))
{
m_iterat++;
}else{
//delete m_iterat->second;
m_iterat=HwndMap.erase(m_iterat);
}
int a(0);
}
if (HwndMap.size())
{
 m_Tdata=(HwndMap.rbegin())->first+5;
HwndMap.insert(pair<int,HWND>(m_Tdata,dlg2->m_hWnd));
}
else
HwndMap.insert(pair<int,HWND>(5,dlg2->m_hWnd));
m_HwndLock.UnLock();
// dlg2->SetIntervalTime(m_Tdata-5);
dlg2->ShowWindow(SW_SHOW);
dlg2->SetWindowPos(&CWnd::wndTopMost,0,0,100,100,SWP_SHOWWINDOW);
MSG msg;
while(::GetMessage(&msg,dlg2->m_hWnd,0,0))
{


TranslateMessage(&msg);
DispatchMessage(&msg);
}
m_HwndLock1.Lock();
HwndMap.erase(HwndMap.upper_bound(m_Tdata));
if (dlg2)
{
dlg2->DestroyWindow();
delete dlg2;
dlg2 =NULL;
}
m_HwndLock1.UnLock();
#else 1
int m_Tdata(5);
SystemTrayDlg *dlg2=new SystemTrayDlg;
ThreadFuncParam *temp=(ThreadFuncParam*)lpParam;
void*info(NULL);
getinfo(&info,temp->stMovieInfo);
dlg2->set_info(info);
dlg2->Create(IDD_DIALOG_TIPS);
//dlg2->Create(IDD_DIALOG1);

m_HwndLock.Lock();
map<int,SystemTrayDlg*>::iterator m_iterat;
for (m_iterat=HwndMap.begin();m_iterat!=HwndMap.end();)
{
if ((m_iterat->second)&&(::IsWindow(m_iterat->second->GetSafeHwnd())))
{
m_iterat++;
}else{
delete m_iterat->second;
m_iterat=HwndMap.erase(m_iterat);
}
int a(0);
}
if (HwndMap.size())
{
 m_Tdata=(HwndMap.rbegin())->first+5;
HwndMap.insert(pair<int,SystemTrayDlg*>(m_Tdata,dlg2));
}
else
{
HwndMap.insert(pair<int,SystemTrayDlg*>(5,dlg2));
}
m_HwndLock.UnLock();
dlg2->SetInterTime(m_Tdata-5);
dlg2->SetWindowPos(&CWnd::wndTopMost,0,0,500,500,SWP_SHOWWINDOW);
MSG msg;
while(::GetMessage(&msg,dlg2->m_hWnd,0,0))
{


TranslateMessage(&msg);
DispatchMessage(&msg);
}
//m_HwndLock1.Lock();
/*HwndMap.erase(HwndMap.upper_bound(m_Tdata));
if (dlg2)
{
dlg2->DestroyWindow();
delete dlg2;
dlg2 =NULL;
}
m_HwndLock1.UnLock();*/
#endif return 0;
}
long fun2(MovieInfo*stMovieInfo1){
ThreadFuncParam *param = new ThreadFuncParam;
MovieInfo*m_stMovieInfo1=new MovieInfo;
GetMovieInfo(*m_stMovieInfo1,*stMovieInfo1);
if (param != NULL)
{
param->stMovieInfo=m_stMovieInfo1;
AfxBeginThread(ThreadFunc, (LPVOID) param);
}
return 0;
}