多线程暂停问题!

gucheng789 2011-07-17 07:00:23

下面是一段多线程的伪代码,多线程会查询界面上的一个按钮,如果按钮按下就执行功能函数 FadeIn() ,

此函数会执行超过 3 秒。

问题1:有没有办法不让线程来查询按钮的状态,而是让按钮来“主动”通知多线程执行??
也就是让按钮的消息响应函数来暂停和开启多线程。
注意:多线程会动态申请内存。

问题2:多线程函数里的 “while(true)//无限循环”多占用50%的CPU资源,
为什么主线程的 “while ( ::GetMessage(&m, NULL, 0, 0) )”像没事一样?




DWORD WINAPI tThreadProc(LPVOID lpParam)// 多线程
{
... ...

BYTE* pxBGA = new BYTE[bitSizeBG];//申请 bitSizeBG 字节的空间
BYTE* pxBGB = new BYTE[bitSizeBG];


int mode = FADEIN_BA;//模式定义

while(true)//无限循环
{
if( IsDown )//判断相应按键是否按下,按下:IsDown 为true。反之
{
if( mode == FADEIN_AB )
mode = FADEIN_BA;
else
mode = FADEIN_AB;

FadeIn(pxBGA, pxBGB, bitmap_BgA, bitSizeBG, mode);
//调用相应的功能函数,注意:此函数会执行超过 3000 毫秒

IsDown = false;//标识符置为假
}

}

delete []pxBGA;//释放空间
delete []pxBGB;

return 0;

}

...全文
272 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kalcaddle 2011-07-24
  • 打赏
  • 举报
回复
推荐你看下这个文章,http://www.cnblogs.com/ahuo/archive/2007/08/22/864948.html
他自定义了消息,并利用PostThreadMessage给指定的线程发消息。
我认为你一次挂起多个线程,将维持一个vector<HANDLE>用于保存开启的线程句柄,来挂起多线程和唤醒。
while(true)占用cpu,你可以Sleep(100);嘛
SEESEECN 2011-07-19
  • 打赏
  • 举报
回复
1#define WM_*** WM_USER + 100
SDK里面这样定义消息不行吗?

2可以啊。知道事件么?
在线程函数里面调用WaitForSingleObject(...)等待按钮按下事件发生。这样在按钮按下前,你的这个线程就挂起了。
然后在按钮响应函数中,当按钮按下后,就SetEvent。
gucheng789 2011-07-17
  • 打赏
  • 举报
回复

杯具,在SDK下怎么自定义消息的?

有具体例子没有?

“GetMessage函数接收来自调用线程消息队列中的消息,如果没有消息到来,将会挂起该线程。既然挂起了就不会占CPU了“

那我可以挂起多线程不?

在按钮消息响应函数里实现挂起和开启多线程??

Eleven 2011-07-17
  • 打赏
  • 举报
回复
1. 可以通过向线程发送自定义消息PostThreadMessage();在线程函数中PeekMessage()。
2. GetMessage函数接收来自调用线程消息队列中的消息,如果没有消息到来,将会挂起该线程。既然挂起了就不会占CPU了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧