各位大侠,我开发了一个图形化的应用程序,在这个程序的doc里面有一个读写数据库的线程,前台界面根据读取的数据库显示一些信息,现在我想实现当服务器上mysql服务关闭了或是断网了,在读写线程中关闭整个应用程序,请问如何实现?

解决方案 »

  1.   

    线程给应用程序的主窗口发送WM_CLOSE消息
      

  2.   

    我试着获取::AfxGetMainWnd()->GetSafeHwnd()来PostMessage(WM_CLOSE这个消息),但是没有作用.
    采用::AfxGetMainWnd()->DestoryWindow()编译能通过,但是运行时报错,难道线程的LP参数必须准话为主窗口的指针吗?因为我把他转化为了Doc的指针?
      

  3.   

    不要直接到在线程中利用AfxGetMainWnd()->PostMessage(WM_CLOSE);你应该将主窗口的HWND窗口句柄作为线程函数的参数传递给线程,例如:
    AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());UINT __cdecl ThreadProc(LPVOID lParam)
    {
     HWND hWnd = (HWND)lParam;
     ASSERT(hWnd);
     .... PostMessage(hWnd, WM_CLOSE, 0, 0);
     return 0;
    }
      

  4.   

    强制退出线程对程序有问题,不建议这样做!用 CreateEvent来做
      

  5.   

    个人觉得,现隐藏主窗口,然后postmessage(...,WM_CLOSE,0,0);
      

  6.   


    由于AfxBeginThread(ThreadProc, this);是写在这个项目的Doc类里面的,传得是this指针,因为在doc类成员里面有一个控制互斥访问的成员变量,我在线程里面必须要用,那如果我写成AfxBeginThread(ThreadProc, (LPVOID)::AfxGetMainWnd()->GetSafeHwnd());怎么在线程里面得到该Doc的指针呢?请问我把主窗口的HWND窗口句柄和Doc指针封装成结构体传给线程,这样可以吗?
      

  7.   


    TO:VisualEleven
    刚刚在网上又看了一下,有的说在线程里面可以使用::AfxGetApp()->GetMainWnd()或是AfxGetApp()->m_pMainWnd->m_hWnd,但是我运行时会出错,跟踪了一下,AfxGetApp()可以获得一个值,但是再往后就为NULL呢,求解释?
    PS:我一开始直接在线程中使用::AfxGetMainWnd()也能获得一个值,不是为NULL的,就是在运行的时候报错。奇怪!!!!