关于GetMouseMsg的改进提议!
easyx吧
全部回复
仅看楼主
level 4
tiancao222 楼主
最近写了一个网络对战平台的框架,其中客户端部分在编写的时候出现了一些问题:
我在游戏客户端主线程启动后面两个线程:一个线程写死循环用GetMouseMsg不断的获取鼠标操作并改变数据,然后另一个线程使用easyX库根据刚才改变的数据画出游戏的内容。(两个线程协同工作)
现在的问题是第一个线程中GetMouseMsg是阻塞的,我无法在主线程中合法的关闭它!目前只能采用TerminateThread的方法来“强制”关闭!(所有人都说这个方法是不可取的)
建议easyX小组能够改进一下这个函数,或者提供另一个函数能够跨线程让GetMouseMsg退出阻塞状态!(最好在返回值上也跟普通的鼠标消息以示区别)
这样就能够跨线程的方便访问了!
另外,也可能是我的框架写的有问题,若大家谁有好的思路也可以告诉我,多谢了!~
2014年04月01日 13点04分 1
level 4
tiancao222 楼主
消灭0回复。同志们谁有点建议啊……
2014年04月02日 01点04分 2
level 12
可以不阻塞的吧?用while
2014年04月05日 09点04分 3
level 11
if(MouseHit())
getmousemsg()
这样不就不阻塞了
2014年04月05日 16点04分 4
谢谢楼上回答,不过还是有问题啊。
2014年04月08日 00点04分
level 4
tiancao222 楼主
首先谢谢以上各位的回答,这种写法是可以实现目的:
while(1)
{
if(MouseHit())
GetMouseMsg();
}
但是这种写法有个最严重的问题,就是在没有鼠标消息时相当于死循环,会让一个CPU核的占用率达到100%。
2014年04月08日 00点04分 5
Sleep() 就好了
2014年04月08日 02点04分
回复 fammy043 :这个我想过,问题是这样做非常不正规啊,而且Sleep期间啥都不能处理啊,这种方法还是不太科学。有没有更好的方法啊?~
2014年04月11日 05点04分
回复 tiancao222 :sleep 个几十毫秒就足够了
2014年04月11日 09点04分
回复 tiancao222 : Sleep 的方法很正规吧,目的就是让当前线程暂停,以便让 cpu 空闲出来处理其他程序的消息。
2014年04月14日 16点04分
level 4
tiancao222 楼主
吧主啊,我有个初步想法,就是上面贴不下,我贴到新楼层:
MOUSEMSG GetMouseMsg()
{
………………
while(1)
{
WaitMessage();//等待当前线程发生消息
//截获所有MOUSE消息
if (PeekMessage(&msg,NULL,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE))
{
//处理所有的鼠标消息,然后返回相应的值
return oldGetMouseMsg();//以前的GetMouseMsg版本
}
//下面根据自定义的WM_MY_QUIT消息,来判断是否退出GetMouseMsg
if(PeekMessage(&msg, NULL, WM_MY_QUIT, WM_MY_QUIT, PM_REMOVE))
{
return xxx;//返回一个值以区别正常的鼠标消息
}
}
………………
}
void QuitGetMouseMsg()
{
SendMessage(..., WM_MY_QUIT, ...);//用这个发送给主窗口,专门用来退出GetMessage
}
2014年04月15日 00点04分 6
1