怎样让一个控制台程序定长时间读

6 篇文章 0 订阅

 

1. linux可以发信号/中断的方法实现。



2. windows/linux 通用方法

bool wait_stdin_line( int ms )

{

#ifdef WIN32
 
    HANDLE eventHandles =  GetStdHandle(STD_INPUT_HANDLE)    ;

    DWORD result = WSAWaitForMultipleEvents( 1, 
                                            &eventHandles , 
                                            TRUE, 
                                            ms, 
                                            TRUE
                                            );

     if( result !=  WSA_WAIT_EVENT_0   ) return  false ;

    INPUT_RECORD record;
    DWORD numRead;
    if(!PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)) { 
        return false;
    } 

    if( record.EventType != KEY_EVENT ||  !record.Event.KeyEvent.bKeyDown) { 
        ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)  ; 
        return false;
    } 

    return true;  

#else
     
    tick_t start = sysinfo::get_tick_count();

    struct timeval tv;
  
    tv.tv_sec = ms / 1000;
    tv.tv_usec = ( ms % 1000 )*1000;

    fd_set fds;
    FD_ZERO(&fds);

    int r = 0 ;
    FD_SET(STDIN_FILENO, &fds); // STDIN_FILENO = stdin = 0

    my_loop:
      r = select( STDIN_FILENO+1, &fds, NULL, NULL, &tv)  ;
     
    if( r == 0 ) return false ;  // timeout

    if( r == -1 && errno == EINTR  ){   

       // or pselect( ..., signal_set ) 代替 select, 就无需这个 loop 了
       //  代码会简洁 ,  但会导致信号处理线程变少

        int  lapse = (int)get_tick_lapse( start ) ;
        if( lapse >= ms ) return false ;
        else{
            FD_ZERO(&fds);
            FD_SET(STDIN_FILENO, &fds);  
            lapse = ms - lapse ;
            tv.tv_sec = lapse/ 1000;
            tv.tv_usec = ( lapse% 1000 )*1000;
             goto my_loop ;
        } 
    } 
    return true ;
#endif         

}    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值