3574|7

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WaitForMultipleObjects 等到了两倍时间 [复制链接]

我使用WaitForMultipleObjects函数来等待一些信号,奇怪的是为什么我等待的时间变成了两倍我设置的时间?比如我设置的等待时间是30秒,那么我会在1分钟的时候才收到一个Timeout的超时返回?不知道为什么,郁闷一上午了,不知道有没有人碰到过????

最新回复

搞定,感谢guopeixin的提醒!!!!  详情 回复 发表于 2009-10-17 15:56
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
由于ce不是硬rtos系统,调度时间会有误差,但是超过30s肯定就不是这个原因引起的了
能不能把代码粘贴出来看一下
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
RETAILMSG(BAK_DEBUG, (TEXT("BACKLIGHT waitefor signal ...... dwTimeout = %d\r\n"), dwTimeout));
                        dwResult = WaitForMultipleObjects(NUM_EVENTS, g_evtSignal, FALSE, dwTimeout);

                        //  If we are signaled by registry event
                        if(WAIT_OBJECT_0 == dwResult)
                        {
                                RETAILMSG(BAK_DEBUG, (TEXT("BackLight waitefor registry signal\r\n")));
                                //重设注册表
                                //  All we need to do is to read from registry and update the tick count
                                BL_ReadRegistry(&g_BLInfo);

                                //重设置dwTimeout的值
                                if(bIsACOn)
                                {
                                        dwTimeout = g_BLInfo.m_dwACTimeout * 1000;
                                }
                                else
                                {
                                        dwTimeout = g_BLInfo.m_dwBatteryTimeout * 1000;
                                }
                                if(dwTimeout == 0 || g_BLInfo.m_dwStatus == BL_OFF)
                                {
                                        dwTimeout = INFINITE;
                                }
                               
                                //  Always turn on the Backlight after a change to registry
                                BL_On(TRUE);
                        }
                        else if(dwResult == WAIT_OBJECT_0+1)
                        {
                                RETAILMSG(BAK_DEBUG, (TEXT("BackLight waitefor key or touch signal\r\n")));
                                //点击了触摸或按键
                                //  User activity, depending on the situation, we may / may not update
                                //  the tick count

                                if(bIsACOn)
                                {
                                        if(g_BLInfo.m_bACAuto)
                                        {
                                                //  Turn on backlight
                                                BL_On(TRUE);
                                        }
                                }
                                else
                                {
                                        if(g_BLInfo.m_bBatteryAuto)
                                        {
                                                BL_On(TRUE);
                                        }
                                }  
                        }
                        else if(dwResult == WAIT_OBJECT_0+2)
                        {
                                RETAILMSG(BAK_DEBUG, (TEXT("BackLight waitefor power change signal\r\n")));
                                //  When AC is plugged or un-plugged, we don't really need to do anything
                                //  We continue the loop. The correct timeout value will be assigned at
                                //  the top of the while loop.
                                //电源更换,暂时没做
                        }
                        else if(dwResult == WAIT_TIMEOUT)
                        {
                                RETAILMSG(BAK_DEBUG, (TEXT("BackLight waitefor close backlight signal\r\n")));
                                //  Time out, let's turn the device off
                                BL_On(FALSE);
                        }
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
问一下:
从哪里可以看到“我设置的等待时间是30秒,那么我会在1分钟的时候才收到一个Timeout的超时返回 ”?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
dwTimeout,这个值是从注册表读取的,或者别的地方可以设置的,在等待之前我有把这个值打印出来,绝对是30秒,如果什么也不做,要等到1分钟的时候才有RETAILMSG(BAK_DEBUG, (TEXT("BackLight waitefor close backlight signal\r\n")));
这句打印执行。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
那就怪了,
你系统的timer有没有什么不正常,系统调度的tick和ms之间是几比几的关系?

那就先从两方面把问题给确认一下吧
1. timeout值
RETAILMSG(BAK_DEBUG, (TEXT("BACKLIGHT waitefor signal ...... dwTimeout = %d\r\n"), dwTimeout));
2. 两次wait到事件的时间 ,直接输出时间看一下
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
你系统的timer有没有什么不正常,系统调度的tick和ms之间是几比几的关系?
看来是这里的问题了,打印显示的是间隔3000,但实际时间是6000ms,看来是:tick和ms之间是几比几的关系,这里有问题,请问这个应该在哪里看?小弟初学驱动,还不大懂。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
搞定,感谢guopeixin的提醒!!!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表