当前位置:  技术问答>linux和unix

如何避免一个函数过快的执行

    来源: 互联网  发布时间:2016-04-29

    本文导语:  同一函数的执行间隔不能太短,这个有什么好的方法,以前用线程,感觉太那个了点,处理alarm也不是太好, 有啥子好用的方法? | 曾经做过测试,一个人以最快速度连续按键,间隔时间也会...

同一函数的执行间隔不能太短,这个有什么好的方法,以前用线程,感觉太那个了点,处理alarm也不是太好,
有啥子好用的方法?

|
曾经做过测试,一个人以最快速度连续按键,间隔时间也会长达数十毫秒。难道你的探头枚举在这么长的时间内无法搞定?
而嵌入式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

|
[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

很詳細!

|
sleep
usleep
nanosleep
select

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux/Unix是如何避免硬盘碎片的
  • java自动根据文件内容的编码来读取避免乱码
  • 大家提供一个避免空指针操作的好方法?
  • 指教怎样避免空指针。。。
  • redhat7.3是不是有问题??为什么在拖动窗口的时候容易死机??怎么避免??
  • 有潜在危险的 Request.Form 值避免方法
  • 打开窗口时如何避免自动切换到中文输入法?
  • unix-遍程基础:避免僵尸进程defunc的方法有那些?欢迎参与讨论
  • 我每次用emacs编辑文件后,总要生成一个副本,问怎么避免它
  • HELP~~~~~~JTREE里面如何避免重复的节点出现
  • 如何简单的避免程序的重复启动?
  • broken pipe是什么意思啊,如何避免阿?
  • 请问Killed系统错误是什么原因造成的?如何避免?
  • 从window上传到linux文件(覆盖同名文件),为什么文件的访问权限会变,怎么避免?
  • 取seesion当seesion为空是抛出异常?怎么避免?
  • 请问,在一个进程中创建多线程时如何能避免不同的线程获得同一个线程标识
  • 一个字符串分割来存到DB中的问题:如何避免一个汉字被从中间分割掉?
  • 请教如何避免不登录就直接访问一个jsp文件
  • sql语句中单引号嵌套问题(一定要避免直接嵌套)
  • [Q] WINDOW2000下安装REDHAT2.1,如何避免把NT的分区数据覆盖?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3