1.停止服务
1.SetEvent(stopServiceEvent);
设置stopServiceEvent为有信号状态
2.monitor_sessions()中判断stopServiceEvent为有信号状态
将ToCont = FALSE;
退出循环并将hEvent(hEvent = CreateEvent(NULL, FALSE, FALSE, "Global\\SessionEventUltra");)
设置为有信号状态
3.创建进程的时候,创建了一个hShutdownEvent(hShutdownEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\SessionEventUltra");)
并起了一个定时器(2秒)实时监测hShutdownEvent是否有信号
一旦判断hShutdownEvent有信号,则将fShutdownOrdered = true;
4.fShutdownOrdered = true;
则退出主进程的循环并等待线程退出
5.各个线程的退出流程
1.imp_desktop_thread
fShutdownOrdered = true;
menu->Shutdown(true);
发送WM_CLOSE消息关闭菜单窗口
关闭套接字
2.vncClientThread
线程循环函数:vncClientThread::run(void *arg)
由于menu->Shutdown(true);关闭了套接字
m_socket->ReadExact(...);返回FALSE
退出循环并做清理工作
if (m_client->m_updatethread)
{
m_client->m_updatethread->Kill();
m_client->m_updatethread->join(NULL);
}
使vncClientUpdateThread退出
3.vncClientUpdateThread退出
由 m_client->m_updatethread->Kill();退出
4.InitWindowThread(VncDestop)
fShutdownOrdered = true; 销毁窗口并退出循环
并SetEvent(trigger_events[5]);
5.vncDesktopThread线程
fShutdownOrdered = true;
trigger_events[5]有信号,looping = false
退出线程
6.主线程线程退出并清理
7.服务等待进程结束后,将服务停止并退出
2.Viewer端断开
1.vncClientThread线程先退出
void vncClientThread::run(void *arg)
connected = false ,退出while (connected)循环
清理线程
if (m_client->m_updatethread) {
m_client->m_updatethread->Kill();
m_client->m_updatethread->join(NULL);
}
使m_updatethread退出循环
m_server->RemoveClient(m_client->GetClientId());
删除对应的连接
delete m_desktop;
StopInitWindowthread();
在StopInitWindowthread中调用PostThreadMessage(pumpID, WM_QUIT, 0, 0);
结束InitWindowThread线程
SetEvent(trigger_events[5]);
结束vncDesktopThread::run_undetached
2.vncClientUpdateThread退出线程
由 m_client->m_updatethread->Kill();退出
3.InitWindowThread退出线程
由Desktop析构函数调用StopInitWindowthread();
4.vncDesktopThread
由Desktop析构函数调用SetEvent(trigger_events[5])使线程退出
线程退出,调用DoStopSvc停止服务
5.imp_desktop_thread
fShutdownOrdered = true;
退出主线程