UINT CMainFrame::CThreadProc(LPVOID pParam)
{ CSMReceive *dlg=new CSMReceive;
dlg->m_OrgAddr=sOrgAddr;
dlg->m_Message=sUserData;
dlg->Create(IDD_RECEIVEDLG);
CString title;
title.Format("收到来自*%s*的短讯",sOrgAddr);
dlg->SetWindowText(title);//改变对话框的标题
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
return 0;}void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(CThreadProc,this);
CFrameWnd::OnTimer(nIDEvent);
}
原来,没有用多线程时,程序可以正常工作,弹出对话框来,为什么,改为多线程后,代码如上,反而一闪而过,对话框自动消失了.
{ CSMReceive *dlg=new CSMReceive;
dlg->m_OrgAddr=sOrgAddr;
dlg->m_Message=sUserData;
dlg->Create(IDD_RECEIVEDLG);
CString title;
title.Format("收到来自*%s*的短讯",sOrgAddr);
dlg->SetWindowText(title);//改变对话框的标题
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
return 0;}void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(CThreadProc,this);
CFrameWnd::OnTimer(nIDEvent);
}
原来,没有用多线程时,程序可以正常工作,弹出对话框来,为什么,改为多线程后,代码如上,反而一闪而过,对话框自动消失了.
解决方案 »
- 重画标题栏问题
- 关于Socket编写发送无附件E_mail程序的问题
- 谁有Allen Holub的《compiler design in C》电子书 ?
- 怎么打开一个projects?
- 怎么模仿IE那样把HTML文件存成单个文件MHT
- 我要使光标移到一个static上的时候,它就变为小手,并且static上的字体的颜色改变,怎么写代码?谢谢!
- 一段关于BMP动画的问题,水平有限就是看不出来哪里不对
- 我是一个喜欢编程序的人(我想我是的,虽然我还从来没有学过,也没写过)我要学习VC,大家有什么经验和入门的方法,请给小弟留下一句话,不胜感激!
- 列表框排序问题(请指点一下)
- 汉字的编码区域
- 请教如何将自己的应用程序和系统后台程序绑定运行?谢谢!!
- 请高手帮忙看一下,这一段程序怎么工作?下一步做什么?
你dlg->ShowWindow(SW_SHOW);
后,程序不会等待,而是接着往下执行
return 0;
那么,此时你的局部变量dlg就会被作为垃圾
自动删除了。
你的对话框也就没有了!!!
改dlg为全局变量就可以了!!!!
CSMReceive *dlg;UINT CMainFrame::CThreadProc(LPVOID pParam)
{
dlg->m_OrgAddr=sOrgAddr;
dlg->m_Message=sUserData;
dlg->Create(IDD_RECEIVEDLG);
CString title;
title.Format("收到来自*%s*的短讯",sOrgAddr);
dlg->SetWindowText(title);//改变对话框的标题
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
return 0;}
还是不行,一样的.为什么???????????????
while(TRUE);
试试。
while(true)
{
....
里面根本没有退出代码
}
而且windows是抢占式多任务,这样做不会挂起系统的。你试试啊。关闭对话框能响应就行了。其他不用管。
{
iRet = GetDeliverSMExEx(&ulsm_ID, &byDestTON, &byDestNPI, sDestAddr,
&byOrgTON,&byOrgNPI, sOrgAddr, &byPRI, &byRP, &byUDHI, &byPID,
&byDCS,sTimeStamp, &ulUDLen, sUserData, &byStatusReport);
strcpy(sOrgAddr,"13862738007");
strcpy(sUserData,"SAFAASFASFASDF");
// if(iRet == 0)//如果接收成功则弹出,接收对话框
dlg=new CSMReceive;
dlg->m_OrgAddr=sOrgAddr;
dlg->m_Message=sUserData;
dlg->Create(IDD_RECEIVEDLG);
CString title;
title.Format("收到来自*%s*的短讯",sOrgAddr);
dlg->SetWindowText(title);//改变对话框的标题
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
}
return 0;不行,导至程序,没有反映了.
而且CSMReceive *dlg=new CSMReceive;
该句分配了空间但没有用delete删除会导致内存泄露
你要在线程中显示界面的话要继承一个线程类,mfc中叫界面线程,具体你参考一下codeguru里面的代码
{ CSMReceive *dlg=new CSMReceive;
dlg->m_OrgAddr=sOrgAddr;
dlg->m_Message=sUserData;
dlg->Create(IDD_RECEIVEDLG);
CString title;
title.Format("收到来自*%s*的短讯",sOrgAddr);
dlg->SetWindowText(title);//改变对话框的标题
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
while(TRUE);}void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(CThreadProc,this);
CFrameWnd::OnTimer(nIDEvent);
}
UINT CMainFrame::CThreadProc(LPVOID pParam)
{ CSMReceive dlg;
dlg.DoModal();
return 0;}
这样应该可以了!
{ CSMReceive *dlg=new CSMReceive;
dlg->m_OrgAddr=sOrgAddr;
dlg->m_Message=sUserData;
dlg->Create(IDD_RECEIVEDLG);
CString title;
title.Format("收到来自*%s*的短讯",sOrgAddr);
dlg->SetWindowText(title);//改变对话框的标题
dlg->CenterWindow();
dlg->ShowWindow(SW_SHOW);
MSG *msg=new MSG;
DWORD dwTimeStarted;
dwTimeStarted = GetTickCount(); while(GetTickCount() - dwTimeStarted < uTimeOut)
{
GetMessage(msg,NULL,NULL,NULL);
if(msg->message == WM_KEYDOWN)
{
m_pSplashWnd->HideSplashScreen();
break;
}
}
return TRUE;
}
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(CThreadProc,this);
CFrameWnd::OnTimer(nIDEvent);
}
这是什么意思啊!是每隔一段时间就执行一次吗?如果是的话,为什么要这样呢?
dlg.DoModal();模式对话框是行的,但我要用非模态的.
{
// TODO: Add your message handler code here and/or call default
AfxBeginThread(CThreadProc,this);
CFrameWnd::OnTimer(nIDEvent);
}
我这个程序,要不断的读数,然后通过对话框显示出来的.
我要回去吃饭了,还有不懂的,晚上再来讨论!
里面用SetTimer()打记时器就可以了!为什么要更开一个线程,且在CMainFrame里执行搞得这么复杂呢?还有什么不懂的吗?
只有使用多线程才行.要不有很多的不行,比如读信息要好长时间的话(例如网络超时),如果没有多线程,程序将没有反应,总的一句话,一定要用多线程, 现在我用了,界面线程.
BOOL CGUIThread::InitInstance(void)
{
CMyDialog *dlg=new CMyDialog;
dlg->Create(IDD_DIALOG1);
dlg->ShowWindow(SW_SHOW);
return true;
}=============================
void CSam_sp_43Dlg::OnGuiT()
{
CGUIThread *p_thread1=new CGUIThread;
p_thread1->CreateThread();
//使用默认参数,由于CGUIThread自动删除,所以不需要保存该指针
}现在好了,谢谢大家,谁能说说,为什么,非得用界面线程.
Sleep(5*1000); 给你5秒钟
{
CMyDialog *dlg=new CMyDialog;
dlg->Create(IDD_DIALOG1);
dlg->ShowWindow(SW_SHOW);
return true;
}=============================
void CSam_sp_43Dlg::OnGuiT()
{
CGUIThread *p_thread1=new CGUIThread;
p_thread1->CreateThread();
//使用默认参数,由于CGUIThread自动删除,所以不需要保存该指针
}
www.codeproject.com/threads/usinguithreads.asp