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);
}
原来,没有用多线程时,程序可以正常工作,弹出对话框来,为什么,改为多线程后,代码如上,反而一闪而过,对话框自动消失了.

解决方案 »

  1.   

    CSMReceive *dlg是局部变量!!!
    你dlg->ShowWindow(SW_SHOW);
    后,程序不会等待,而是接着往下执行
    return 0;
    那么,此时你的局部变量dlg就会被作为垃圾
    自动删除了。
    你的对话框也就没有了!!!
    改dlg为全局变量就可以了!!!!
      

  2.   

    改为:
    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;}
    还是不行,一样的.为什么???????????????
      

  3.   

    我觉得是因为线程结束了造成的,你把return 0;改成:
    while(TRUE);
    试试。
      

  4.   

    程序结束的时候他所产生的线程都会结束的。很多worker线程都是
    while(true)
    {
    ....
    里面根本没有退出代码
    }
    而且windows是抢占式多任务,这样做不会挂起系统的。你试试啊。关闭对话框能响应就行了。其他不用管。
      

  5.   

    while(TRUE)
    {
    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;不行,导至程序,没有反映了.
      

  6.   

    多线程一般都是一个死循环的,你的这个多线程没有意义,
    而且CSMReceive *dlg=new CSMReceive;
    该句分配了空间但没有用delete删除会导致内存泄露
    你要在线程中显示界面的话要继承一个线程类,mfc中叫界面线程,具体你参考一下codeguru里面的代码
      

  7.   

    仔细看看!我是说把return 0 改成:while(TRUE);不过这样也不大好,白占了一个线程。肯定还有更好的方法。
      

  8.   

    谁能写出演示代码,E-MAIL :[email protected] 我很急,急用.
      

  9.   

    天啦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);
    while(TRUE);}void CMainFrame::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    AfxBeginThread(CThreadProc,this);
    CFrameWnd::OnTimer(nIDEvent);
    }
      

  10.   

    这样试试!
    UINT CMainFrame::CThreadProc(LPVOID pParam)
    { CSMReceive dlg;
                      dlg.DoModal();
    return 0;}
    这样应该可以了!
      

  11.   

    CMainFrame::OnTimer(UINT nIDEvent)是不是这个有问题
      

  12.   

    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);
             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;
    }
      

  13.   

    void CMainFrame::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    AfxBeginThread(CThreadProc,this);
    CFrameWnd::OnTimer(nIDEvent);
    }
    这是什么意思啊!是每隔一段时间就执行一次吗?如果是的话,为什么要这样呢?
      

  14.   

    CSMReceive dlg;
    dlg.DoModal();模式对话框是行的,但我要用非模态的.
      

  15.   

    void CMainFrame::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    AfxBeginThread(CThreadProc,this);
    CFrameWnd::OnTimer(nIDEvent);
    }
    我这个程序,要不断的读数,然后通过对话框显示出来的.
      

  16.   

    写界面线程,用AfxBeginThread是另一个AfxBeginThread(CRuntimeClass*....).新建(继承)一个CWinThread,在CWinThread的InitInstance()中创建窗体即可.
      

  17.   

    这样的话,你把这个OnTimer消息放在你的对话框里不就可以了!
    我要回去吃饭了,还有不懂的,晚上再来讨论!
      

  18.   

    你能设计一个,贴上来吗,只要能CREATE SHOW 一个对话框就行了.
      

  19.   

    你的读数和显示都在CMyDialog::OnTimer()里面实现,在CMyDialog::OnInitDialog()
    里面用SetTimer()打记时器就可以了!为什么要更开一个线程,且在CMainFrame里执行搞得这么复杂呢?还有什么不懂的吗?
      

  20.   

    我设计的这个程序,和QQ,对方发送消息过来一样,有消息过来,就弹出消息内容.
    只有使用多线程才行.要不有很多的不行,比如读信息要好长时间的话(例如网络超时),如果没有多线程,程序将没有反应,总的一句话,一定要用多线程,   现在我用了,界面线程.
    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自动删除,所以不需要保存该指针
    }现在好了,谢谢大家,谁能说说,为什么,非得用界面线程.
      

  21.   

    你就是想看看读出的数目吧!
    Sleep(5*1000); 给你5秒钟
      

  22.   

    你的对话框为什么不使用 dlg->DoModal()?
      

  23.   

    还有,这个界面线程,怎么结束法,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自动删除,所以不需要保存该指针
    }
      

  24.   

    that is because UI thread have message loop,but work thread have no.i suggest you put your code in CWinThread::Run method.for more details about UI thread ,see
    www.codeproject.com/threads/usinguithreads.asp