当前位置: 技术问答>linux和unix
如何避免一个函数过快的执行
来源: 互联网 发布时间:2016-04-29
本文导语: 同一函数的执行间隔不能太短,这个有什么好的方法,以前用线程,感觉太那个了点,处理alarm也不是太好, 有啥子好用的方法? | 曾经做过测试,一个人以最快速度连续按键,间隔时间也会...
同一函数的执行间隔不能太短,这个有什么好的方法,以前用线程,感觉太那个了点,处理alarm也不是太好,
有啥子好用的方法?
有啥子好用的方法?
|
曾经做过测试,一个人以最快速度连续按键,间隔时间也会长达数十毫秒。难道你的探头枚举在这么长的时间内无法搞定?
而嵌入式RTOS的线程上下文切换一般是几个微秒。我想一般情况下调用间隔不会很快。
在这种情况下,如果你对探头的枚举处理速度比较快的话可以插入关中、开中来屏蔽掉这中间的按键事件。如果处理时间较长,可以利用我上面描述的方法。
这也就是一种比较基本的防止公共例程重入的方法。
根据你的描述,你的这个例程应该是在一个后台线程中执行的。这样的话,开关中断加标志可以用互斥量mutex来代替。
我想这样应该可以解决你的例程重入问题。
而嵌入式RTOS的线程上下文切换一般是几个微秒。我想一般情况下调用间隔不会很快。
在这种情况下,如果你对探头的枚举处理速度比较快的话可以插入关中、开中来屏蔽掉这中间的按键事件。如果处理时间较长,可以利用我上面描述的方法。
这也就是一种比较基本的防止公共例程重入的方法。
void EnumerateCamera(void* pYourArgs)
{
static volatile int ifRe_entrance = 1; // 一开始,可以进入该例程
cli(); // 这里要对进入标志进行判断并且做相应修改,因此需要做一下关中
if(!ifRe_entrance)
{
sti();
return; // 这里除了直接返回之外,你还可以通过类似旋锁的方式,一直去轮循这个标志
} // 比如:while(!ifRe_entrance);
ifRe_entrance = 0; // 将“门”关上
sti(); // 开中
// Do your Enumeration here
IamProcessingCameras(pYourArgs);
// Finally, make the "door" open
ifRe_entrance = 1; // 这里,你可以不加开关中断,对系统不会有严重的负面影响
}
根据你的描述,你的这个例程应该是在一个后台线程中执行的。这样的话,开关中断加标志可以用互斥量mutex来代替。
我想这样应该可以解决你的例程重入问题。
|
在适当的地方适当延时一下吧
延时函数 有
usleep(n)
n微秒
sleep(n)
只能延时一秒以上
用setitimer()然后signal(SIGARLM, fun) pause();
struct timeval tm;
tm.tv_sec = sec_time; //延时秒
tm.tv_usec = u_time; //延时毫秒
select(65535,NULL,NULL,NULL,&tm);
//你可以去查看下关于select()函数~
=========================================
不知道你喜欢用哪一个?
|
进程的话估计可以sleep .......
|
就是睡!没别的办法了!
sleep
sleep
|
sleep
|
[Quote=引用 1 楼 Gdatasheet 的回复:]
在适当的地方适当延时一下吧
延时函数 有
usleep(n)
n微秒
sleep(n)
只能延时一秒以上
用setitimer()然后signal(SIGARLM, fun) pause();
struct timeval tm;
tm.tv_sec = sec_time; //延时秒
tm.tv_usec = u_time; //延时毫秒
select(65535,NULL,NULL,NULL,&tm);
//你可以去查看下关于select()函数~
=========================================
不知道你喜欢用哪一个?
[/Quot
很詳細!
在适当的地方适当延时一下吧
延时函数 有
usleep(n)
n微秒
sleep(n)
只能延时一秒以上
用setitimer()然后signal(SIGARLM, fun) pause();
struct timeval tm;
tm.tv_sec = sec_time; //延时秒
tm.tv_usec = u_time; //延时毫秒
select(65535,NULL,NULL,NULL,&tm);
//你可以去查看下关于select()函数~
=========================================
不知道你喜欢用哪一个?
[/Quot
很詳細!
|
sleep
usleep
nanosleep
select
usleep
nanosleep
select