select定时器的简单实现

13 篇文章 4 订阅
   int select(int nfds, fd_set *readfds, fd_set *writefds,
              fd_set *exceptfds, struct timeval *timeout);

   void FD_CLR(int fd, fd_set *set);//从指定的文件描述符集合中删除指定文件描述符fd
   int  FD_ISSET(int fd, fd_set *set);//判断文件描述符fd 是否存在于文件描述符集合set中
   void FD_SET(int fd, fd_set *set);// 将文件描述符fd 放到 文件描述符集合set中
   void FD_ZERO(fd_set *set); //清空一个文件描述符集合



nfds : 文件描述符数量,不过指的是 所包含的最大文件描述符 +1 的值
readfds:可读的 文件描述符集合
writefds:可写的 文件描述符集合
exceptfds:异常的文件描述符集合
timeout 超时设置,阻塞。如果不实现超时设置,那么该函数会死等

 EINTR  A signal was caught; see signal(7). 阻塞等待 可以被信号打断

  EINVAL nfds is negative or exceeds the RLIMIT_NOFILE resource limit (see getrlimit(2)).

   EINVAL the value contained within timeout is invalid.

   ENOMEM unable to allocate memory for internal tables.

   The time structures involved are defined in <sys/time.h> and look like

秒+微秒
           struct timeval {
               long    tv_sec;         /* seconds */
               long    tv_usec;        /* microseconds */
           };

基于select函数的特性,我们可以用它来实现一个安全的休眠

/* select定时器 */
void selectAlrm(int sec)
{
   struct timeval tm;

   tm.tv_sec = sec;
   tm.tv_usec = 0;

   select(0, NULL, NULL, NULL, &tm);
   return ;
}

微秒级别的实现方法一致;

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VBA中,我们可以使用`Application.OnTime`方法来实现定时器功能。以下是一个简单的例子,演示如何使用定时器来控制状态机: ``` Sub StateMachine() Dim currentState As Integer currentState = 1 Do While currentState <> 0 Select Case currentState Case 1 ' 状态1 ' 执行状态1的代码 ' 设置状态2的定时器 Application.OnTime Now + TimeValue("00:00:05"), "StateMachineChangeState(2)" ' 将状态机切换到状态2 currentState = 0 ' 先将状态设为0,等定时器触发后再切换状态 Case 2 ' 状态2 ' 执行状态2的代码 ' 设置状态1的定时器 Application.OnTime Now + TimeValue("00:00:10"), "StateMachineChangeState(1)" ' 将状态机切换到状态1 currentState = 0 ' 先将状态设为0,等定时器触发后再切换状态 End Select Loop End Sub Sub StateMachineChangeState(newState As Integer) ' 将状态机切换到指定状态 currentState = newState End Sub ``` 这里使用了`Application.OnTime`方法来设置定时器,第一个参数是触发时间,第二个参数是定时器触发后要执行的子程序名称。在状态1中,我们设置了一个5秒的定时器,当定时器触发时,会执行`StateMachineChangeState(2)`子程序,将状态机切换到状态2。同样,在状态2中,我们设置了一个10秒的定时器,当定时器触发时,会执行`StateMachineChangeState(1)`子程序,将状态机切换回状态1。 在`StateMachineChangeState`子程序中,我们只需要将状态机的当前状态设置为指定的状态即可。 需要注意的是,在状态机的主循环中,我们需要将当前状态设置为0,并等待定时器触发后再进行状态切换,否则会出现定时器触发后立即切换状态的情况,导致状态机无法正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值