我建的工程是多文档的,有一菜单项,选择后将EXCEL中的数据一条一条的导入数据库中,在导入过程中需要在下面的状态条显示已导入的条数。如果此时不在电脑上做任何操作,可以看到状态条的变化。但是,如果此时如果做其他操作,如打开其他文件,这时,程序的窗体就再也不能打开了,虽然它还在运行,但我不能看到任何显示,对程序使用右键:最大化或还原,都没用。
有好心人告诉我该用线程,可是,我从未用过线程。查了一些线程的资料,还是很晕,不知该怎么才能看到状态条的变化,使程序使用右键:最大化或还原能有用。
谢谢各位,能给个详细些的说明吗?

解决方案 »

  1.   

    导入过程中假死是因为数据库操作阻塞了主线程,导致主线程无法及时响应消息(如按键,恢复窗口)
    写个简单的线程AfxBeginThread,UINT Thread1(LPVOID),将操作对象传进线程操作就可以了
      

  2.   

    如何在状态栏中实现进度指示器控制
    http://www.vckbase.com/document/viewdoc/?id=506
      

  3.   

    我是这样在状态条显示进度的
    CStatusBar* pStatus;
    pStatus->SetPaneText(0,"已导入记录数",true);
    只要执行到pStatus->SetPaneText(0,"已导入记录数",true);就会出错
      

  4.   

    CStatusBar* pStatus;被赋值了吗?设断点看下
      

  5.   

    在16位时代,这么搞:
    LoopProgressBar()
    {
      //increase progress
      PumpMessage();
    }其中PumpMessage()让 Windows 系统 释放CPU给别的任务在32位时代,用多线程啦!最好学会多线程,不难,以后还要有的哦!
      

  6.   

    一、 myApp.cppUINT MYProc(LPVOID pParam)
    {
      CUIThread * m_UIthread;
      m_UIthread=NULL;
      m_UIthread->MyThread(ExcelNameStr); 
      return 1;
    }void CMyApp::ReadExcel()
    {
      CWinThread* m_pThread;
      m_pThread=NULL;
    m_pThread=AfxBeginThread(MYProc, this, THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED, NULL);
      if(m_pThread!=NULL)
    m_pThread->ResumeThread();
    }BOOL CMyApp::ImportFromExcel(CString ExcelName)
    {
    CStatusBar* pStatus;
      err="正在进行数据导入,请稍侯..... ";
    pStatus->SetPaneText(0,err,true);
    }
    二、UIThread.cpp
    UINT CUIThread::MyThread(CString ExcelName)
    {
      CMyApp *m_pApp;
      m_pApp=NULL;
      m_pApp->ImportFromExcel(ExcelName);  
      return 1;
    }我在执行到函数ImportFromExcel(CString ExcelName)中以下一句时就会出错
    pStatus->SetPaneText(0,err,true);
    我并没有使用进度条,只是希望通过时时更新状态条来显示进度
    怎么办呀?谢谢各位,我是从零学起的,千万别笑话我
      

  7.   

    问题在于你还没获得状态条就使用他
    CStatusBar* pStatus=wndStatusBar;
    wndStatusBar自己获取
      

  8.   

    我还是要问wndStatusBar,我要定义成什么样呀,因为程序提示如下:
     'wndStatusBar' : undeclared identifier
      

  9.   

    wndStatusBar只是举个例子你要获得的是MainFrame的m_wndStatusBar,在里面自己写个GetStatusbar返回句柄就可以了
      

  10.   

    UINT CUIThread::MyThread(CString ExcelName)
    {
      CMyApp *m_pApp;
      m_pApp=NULL;
      m_pApp->ImportFromExcel(ExcelName);  
      return 1;
    }
    m_pApp被赋值为NULL,怎么可以调用他的ImportFormExcel方法呢?
    不需要到下一句,你这一句就有问题。这个函数也有同样的问题。
    UINT MYProc(LPVOID pParam)
    {
      CUIThread * m_UIthread;
      m_UIthread=NULL;
      m_UIthread->MyThread(ExcelNameStr); 
      return 1;
    }你应该这样写。
    UINT MyProc(LPVOID p)
    {
       CMyApp * m_UIthread = (CMyApp*)p;
       m_UIthread->MyThread(ExcelNameStr); 
       return 1;
    }
     BOOL CMyApp::ImportFromExcel(CString ExcelName)
    {
    CStatusBar* pStatus;
      err="正在进行数据导入,请稍侯..... ";
    pStatus->SetPaneText(0,err,true);
    }
    这个函数出错是因为你的pStatus没有赋值。
    你的进度条在什么地方,应该怎样访问,你自己应该清楚。
    例如在Dialog上可以这样写
    CStatusBar *pStatus = (CStatusBar*)GetDlgItem(...);