void CMainFrame::OnImport() 
{
    hRunThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)&pRunExcelThread, (void *)this, 0, &dwRunThreadID);
}UINT pRunExcelThread (void* p)
{
    if(!AfxOleInit())//这就是初始化COM库   
    {   
        AfxMessageBox("OLE初始化出错!");   
    }
    CMainFrame *pMF = (CMainFrame*)p;      _ConnectionPtr m_pConnection; 
    _CommandPtr m_pCommand;
    m_pConnection.CreateInstance(_uuidof(Connection)); 
    m_pConnection->Open ("xxxxx", "", "", adModeUnknown); 
    m_pCommand.CreateInstance (__uuidof(Command));
    m_pCommand->ActiveConnection = m_pConnection;
    m_pCommand->CommandType = adCmdStoredProc;    m_pCommand->CommandText=_bstr_t(_T("PROCE_DATAIMPORT_MERCHANT"));  //SP Name  proce_DataImport_Merchant
        m_pCommand->Parameters->Refresh();       
    m_pCommand->Parameters->Item[_variant_t (_bstr_t ("merchid"))]->Value=_variant_t ("301110054110169");   
    m_pCommand->Parameters->Item[_variant_t (_bstr_t ("merchname"))]->Value=_variant_t ("华糖洋华堂商业有限公司"); 
    m_pCommand->Execute (NULL, NULL, adCmdStoredProc);    if (m_pCommand!=NULL)
          m_pCommand.Release();
    if ((m_pConnection!=NULL) && (m_pConnection->State))
    {
        m_pConnection->Close();
        m_pConnection.Release();
    }
    m_pConnection = NULL;
    m_pCommand = NULL;
    }
    ::PostMessage ( pMF->m_hWnd, WM_END_THREAD, (WPARAM) 0, (LPARAM) 0);
    return 0;
}
//PostMessage里WM_END_THREAD 为自定义消息:
LONG CMainFrame::OnEndThread (WPARAM w, LPARAM l)
{
    if (NULL != hRunThread)
        CloseHandle (hRunThread);
    CClientDC dc (this -> GetActiveView ());
    dc.TextOut (0, 0, "执行结束...");
    hRunThread = NULL;
    return 0;
}view显示 “执行结束”,线程里也正确执行了。这时。界面假死,点击任何都没反应,只能强制退出~~~ 谁能解释一下,困扰小弟一天了~~~~~~~~~~~~~~~

解决方案 »

  1.   

    我觉得线程结束了不用管它阿,就让他结束好了
    试试看这样void CMainFrame::OnImport() 
    {
         CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)pRunExcelThread, (void *)this, 0, &dwRunThreadID);
    }UINT pRunExcelThread (void* p)
    {
       ...
            m_pConnection = NULL;
            m_pCommand = NULL;
        }获得主窗口的指针
       CClientDC dc 主窗口指针 -> GetActiveView ());
       dc.TextOut (0, 0, "执行结束...");
    }
      

  2.   

    线程结束,自动就没了
    不过我是这样写的
    AfxBeginThread(MyThreadProc,0,THREAD_PRIORITY_BELOW_NORMAL);
    和你一样
    MyThreadProc中用了ado,进行大量的操作
      

  3.   

    ls兄弟。
    AfxBeginThread(MyThreadProc,0,THREAD_PRIORITY_BELOW_NORMAL); 
    我用这个创建线程就好了
    用createthread 创建就界面就假死了呵呵。奇怪
      

  4.   

    ls兄弟。
    不知道你怎么用ado的
    我起了一个线程,这是线程里的部分每过一分钟链接次数据,然后释放,但是我发现内存不停的涨。。虽然涨幅很小。
    UINT pRunThread (void * p)
    { if(!AfxOleInit())//这就是初始化COM库   
    {   
    AfxMessageBox("OLE初始化出错!");   
    }
             while (!g_bEndThread)
    {
    iTest = time(NULL) - t;
    if ( iTest >= 60 * 1)
    {
    if (pAdCn->Open (acConnStr))
    {
                       pAdCn->Close ();
    }
    t = time(NULL);
    }
    Sleep(1);
    }
    }
    Open  和 close都封装在一个类里
    bool CADOConnection::Open (char *acConnStr)
    {
    HRESULT hr = m_Con.CreateInstance ("ADODB.Connection");
    if(SUCCEEDED (hr)) 
    {
    m_Con->Open (acConnStr, "", "", adModeUnknown);
    }else
    {
    AfxMessageBox("创建_ConnectionPtr对象失败");
    m_Con.Release ();
    m_Con=NULL;
    return false;
    }
    hr = m_cmmd.CreateInstance(__uuidof(Command));
    if(FAILED(hr))  
    {   
    AfxMessageBox("创建_CommandPtr对象失败");

    m_cmmd.Release ();
    m_cmmd=NULL; m_Con.Release ();
    m_Con=NULL;
    return false;  
    } m_cmmd->ActiveConnection = m_Con;
    m_cmmd->CommandType = adCmdStoredProc;
    return true;
    }
    bool CADOConnection::Close (void)
    {
    if (m_cmmd!=NULL)
    m_cmmd.Release();
    if ((m_Con!=NULL) && (m_Con->State))
    {
    m_Con->Close();
    m_Con.Release();
    }
    m_Con = NULL;
    m_cmmd = NULL; return true;
    }你不停的调用试过吗?
      

  5.   

    AfxBeginThread有一些专门针对MFC的初始化,所以在MFC程序中最好使用这个函数创建线程
      

  6.   

    不要使用CreateThread()函数。
    MFC环境使用AfxBeginThread(),如果你不想用这个,至少要用_beginthread()。
    其原因是库函数的线程环境问题。
    AfxBeginThread()创建并维护MFC函数的线程环境,_beginthread()创建并维护C\C++库函数的线程环境。
      

  7.   

    还是用CreateThread,调用之前,你用SetThreadPriority把主线程的优先级设置高一点看看..HANDLE pThread = GetCurrentThread();
    SetThreadPriority(pThread,THREAD_PRIORITY_TIME_CRITICAL);
      

  8.   

    内存的话,你只要把所有定义的智能指针都 =NULL; 就可以了.. 不是ADO的问题,windows会对内存进行管理的,我原来也要天天导数据,开几个月没有问题...