我编写的是一套大型应用系统的服务器端。为了给众多客户端提供实时的服务,系统的基本结构是一个主界面,一个线程池,众多工作线程。本来在银行运行了一段时间了,都是正常的。前几天,我对程序进行升级,要加上几个监控的功能,问题就出来了。一个功能是在主界面线程中一个timer中循环检测另一个外部程序的运行状态,第二个功能是做实时数据备份,由在线程池线程中用AfxBeginThread()启动的三个线程实现。问题就来了,如果单独用其中的一个功能,就不会有问题。如果两个同时用的话,程序就会在第一个功能中发生阻塞,具体就是在timer循环中执行 FindWindow()函数是阻塞了。这到底是怎么会是?请高手解答!!!

解决方案 »

  1.   

    FindWindow即使找不到也不会阻塞啊,是不是其他地方塞住了。
      

  2.   

    FindWindow确实是怪啊。当被查找的程序在运行时,我的程序也可以正常运行,关掉那个以后,我这个也就很快死了。
      

  3.   

    timer循环中执行 FindWindow()函数是阻塞了...先加一个按钮测试一下,如果只执行一次FindWindow也阻塞的话,换别的方法吧。
    如果不是FindWindow的问题,那么就是timer循环的问题,换用查找进程的方法吧。
      

  4.   

    timer循环部分:
    SetTimer(2,5000,NULL);
    //// else if(nIDEvent==2)
    {
    if(FindWindow(NULL,"检测.....")==NULL)
    {
    m_nRestartTimes++;
    if(m_nRestartTimes==3)
    {
    WinExec("DetectServer.exe",SW_HIDE);
    m_nRestartTimes=0;
    }
    }
    }
    ////
    线程部分:
    AfxBeginThread(BackUpToAccess,this,THREAD_PRIORITY_BELOW_NORMAL);     
    AfxBeginThread(BackUpToSQLServer,this,THREAD_PRIORITY_BELOW_NORMAL);
    AfxBeginThread(CheckSQLServerConn,this,THREAD_PRIORITY_BELOW_NORMAL);就是上面两部分冲突
      

  5.   

    如果只是侦听其他程序是否存在可以用
    waitsingleobject的方法
      

  6.   

    由于两个进程是相互监视对方状态,并于一个退出的情况下实施重起,所以不好用waitsingleobject方法。。不知道还有没有其他的可行的方法?
      

  7.   

    可以使用工作者线程来执行这个检查(findwindow
      

  8.   

    在工作者线程中头几次执行findwindow
    会成功,可是几次以后还是被阻塞了
      

  9.   

    这样做太危险了吧,建议使用消息,RegisterWindowMessage和SendMessage(HWND_BROADCAST)
      

  10.   

    要不不要用WinExec,使用CreateProcess,然后WaitForInputIdle
      

  11.   

    timer循环部分:
    SetTimer(2,5000,NULL);
    //// else if(nIDEvent==2)
    {
    if(FindWindow(NULL,"检测.....")==NULL)
    {
    m_nRestartTimes++;
    if(m_nRestartTimes==3)
    {
    WinExec("DetectServer.exe",SW_HIDE);
    m_nRestartTimes=0;
    }
    }
    }
    ////
    线程部分:
    AfxBeginThread(BackUpToAccess,this,THREAD_PRIORITY_BELOW_NORMAL);     
    AfxBeginThread(BackUpToSQLServer,this,THREAD_PRIORITY_BELOW_NORMAL);
    AfxBeginThread(CheckSQLServerConn,this,THREAD_PRIORITY_BELOW_NORMAL);就是上面两部分冲突