运行在后台的程序用了do while(1) 循环后,当关机或者重启的时候,老是提示“是否要立即结束”的提示消息框!你们是否有什么好方法解决这类问题呢?让程序能正常退出。
我可以是否在  do while(1)这个循环结构体中加入 判断 WM_ENDSESSION 或者 WM_QUEARYENDSESSION 的消息判断吗?如果有这个消息,然后就发送 SendMessage(WM_COLSE0) 来关闭程序!
这样的方法是否行得通?

解决方案 »

  1.   

    使用事件对象,不要用do while(1),用这个事件对象代替它。也就是说,当这个事件对象在你主线程退出的时候,你让它改变状态,因为那个后台线程时刻在检测这个事件对象德状态,当它状态改变的时候,就可以退出你的后台线程了。
      

  2.   

    或者再while中判断一个条件,break
      

  3.   

    while(g_bEnd)
    {}WM_QUEARYENDSESSION 的消息判断
    g_bEnd = FALSE
      

  4.   

    while (1)
        {
    /*--------------------------------------------------*/
    MSG msg;
    BOOL bRet;
    if ( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 )

    if (bRet == -1)
    {
    // handle the error and possibly exit
    }
    else
    {
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    }
    }
            /*--------------------------------------------------*/
    if ( !g_isRunning )
            {
    break;
            }
    Sleep(100);   
    } ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
        SetServiceStatus(ServiceStatusHandle, &ServiceStatus);// 在服务停止时VOID WINAPI ServiceCtrlHandler(DWORD dwControl)

        switch(dwControl) 
        { 
    case SERVICE_CONTROL_STOP: 
                    g_isRunning = false;
    ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
    SetServiceStatus( ServiceStatusHandle, &ServiceStatus);

    break; 
         ....
             default: 
    break;
        } 
      

  5.   

    #pragma comment(linker,"/entry:WinEntry")
    #pragma comment(linker,"/subsystem:console")
    #pragma comment(linker,"/align:4096")
    #pragma comment(linker,"/merge:.text=.rdata")#include <windows.h>void WinEntry()
    {
    MessageBox(NULL,"","",MB_OK);
    }1024字节