📄 mainthread.cpp
字号:
#include "MainThread.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
//用于回调函数
unsigned int __stdcall MainThread::RunPtr(PVOID pvoid)
{
MainThread *pThread=(MainThread *)pvoid;
pThread->Run();
return 0;
}
MainThread::MainThread()
{
m_bActive = FALSE;
m_bEnd = FALSE;
m_bEndDone = FALSE;
m_bEnterCriticalSection = FALSE;
m_dwLastFrameTime = m_dwStartTime = 0;
//初始化临界区
InitializeCriticalSection(&m_CS);
}
MainThread::~MainThread()
{
DeleteCriticalSection(&m_CS);
}
BOOL MainThread::StartThread()
{
if(!InitInstance())
return FALSE;
m_ThreadHandle=(HANDLE)_beginthreadex(0,0,RunPtr,this,0,&m_ThreadID);
if(0!=m_ThreadHandle)
{
m_bEnd = FALSE;
return TRUE;
}
return FALSE;
}
//在激活线程之前,先执行这个函数,做一些初始化工作
BOOL MainThread::InitInstance()
{
return TRUE;
}
int MainThread::ExitInstance()
{
return 0;
}
//线程主循环,操作系统会不断调用这个函数
//在这里主要进行轮循处理
void MainThread::Run()
{
while(!m_bEnd)
{
if(m_bActive) //如果处于非活动状态(比如已经与数据服务器断开)
{
Sleep(10); //给其他线程一次执行机会
EnterCriticalSection(&m_CS); //进入临界区
m_bEnterCriticalSection = TRUE; //确实进入临界区
// 状态循环
MainLoop();
//动画时间检测,时间到了就让播放
DWORD curtime = GetTickCount();
if(curtime > m_dwLastFrameTime + FRAME_TIME) //时间到,显示下一帧
{
OnFrameTime();
m_dwLastFrameTime = curtime;
}
else if(curtime < m_dwLastFrameTime) //如果反而比上一帧小了,说明到了49天,重新开始计算了
m_dwLastFrameTime = curtime;
LeaveCriticalSection(&m_CS); //离开临界区
m_bEnterCriticalSection = FALSE; //确实进入临界区
}
else
{
Sleep(1000); //不工作
continue;
}
}
ExitInstance();
m_bEndDone = TRUE;
_endthreadex(0);
}
//显示下一帧
void MainThread::OnFrameTime()
{
if (g_pGUIRoot)
g_pGUIRoot->Import_FrameDraw();
}
void MainThread::MainLoop()
{
if (g_pGUIRoot)
g_pGUIRoot->Import_Updata(FRAME_TIME / 1000.0f);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -