多线程实在是太神奇了

继续昨天用多线程实现了菜单绘图2不误的功能,今天又研究出了个好东西。
实现了2个功能。


昨晚看Jeffrey的核心编程,看到了线程处提到了事件内核变量,突然想到可以用这个实现当窗口inactive的时候挂起绘图线程,也就是一种实现暂停游戏的方法。因为昨天实现的那种效果,拖拽时显示窗口内容(还是不断更新的),实在是让我觉得很不爽!于是想实现在拖拽的先pause game的功能。
本来想看一下SDL Reference里面有没有SDL提供的能够实现类似功能的东西,不过找了半天也没发现合适的,倒是有那么2个一个信号,一个条件,但都不能实现我想的用事件内核变量实现的功能,所以只好直接用windows的东西了,也许这样以后port to linux会很不方便,管他呢。(还有,看ref的时候,多线程部分好像提到了一些guideline,里面说最好不要在其他线程内画图或处理事件-_-!!不过我还没发现什么问题,而且我也想不到比这更好的解决办法)。
具体实现:
起线程前,先
// 初始化内核对象,并设置为通知状态
HANDLE g_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
SetEvent(g_hEvent);
然后在线程事件循环里面WaitForSingleObject(),等待事件内核对象被置为通知状态,从而开始执行绘图等操作。
然后在子类化(不知道这个这么叫合不合适)的新窗口过程函数里面,加上
case WM_ACTIVATE:
// 判断是否active以决定是否挂起线程,来释放CPU资源
switch(LOWORD(wParam))
{
case WA_ACTIVE:
SetEvent(g_hEvent);
break;
case WA_INACTIVE:
ResetEvent(g_hEvent);
break;
}
break;
又来处理app是否active事件。
呵呵,最后发现这种方法还实现了一个我梦寐以求的效果,当程序inactive的时候,绘图线程被suspend,不被CPU调度,然后打开任务管理器,看了一下,哈哈,居然CPU使用基本上为0了(可能有点夸张-_-!!而且就算fmod在播放音乐,也不会占用很多CPU),真是太神奇了,Oh my god!

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。