精华内容
下载资源
问答
  • alarm闹钟

    2018-03-05 17:27:00
    alarm闹钟 alarm闹钟信号alarm理解#include <unistd.h>unsigned int alarm(unsigned int seconds)// 返回值 : 0 或者 剩余的时间. 如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面...





    alarm闹钟

    alarm闹钟

    信号


    alarm理解

    1. #include <unistd.h>
    2. unsigned int alarm(unsigned int seconds)
    3. // 返回值 : 0 或者 剩余的时间. 如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回。

    alarm函数可以设置一个定时器, 在将来的某个时刻调用.
    每个程序只能有一个闹钟时间, 当然, 不是指只有一个alarm()函数调用.

    1. /*************************************************************************
    2. > File Name: alarm_test_1.cpp
    3. > Author: Function_Dou
    4. > Mail:
    5. > Created Time: 2018年03月04日 星期日 16时30分19秒
    6. ************************************************************************/
    7. #include <stdio.h>
    8. #include <unistd.h>
    9. #include <stdlib.h>
    10. #include <signal.h>
    11. static void sig_alarm(int);
    12. int main(void)
    13. {
    14. if(signal(SIGALRM, sig_alarm) == SIG_ERR)
    15. fprintf(stderr, "signal(SIGALRM) error");
    16. alarm(2);
    17. sleep(1);
    18. printf("time out\n");
    19. exit(0);
    20. }
    21. void sig_alarm(int)
    22. {
    23. printf("alarm time out!\n");
    24. exit(0);
    25. }

    运行结果

    1. [root@localhost Signal]# ./a.out
    2. time out

    在此可以看出, 调用alarm()函数调用后, 程序会继续执行, 而不会像sleep()一样阻塞. 因为alarm()如果阻塞, 那么当2s过了会调用sig_alarm()函数, 而不是再执行sleep()了.

    验证

    1. #include <stdio.h>
    2. #include <unistd.h>
    3. #include <stdlib.h>
    4. #include <signal.h>
    5. static void sig_alarm(int);
    6. int main(void)
    7. {
    8. if(signal(SIGALRM, sig_alarm) == SIG_ERR)
    9. fprintf(stderr, "signal(SIGALRM) error");
    10. alarm(2);
    11. printf("hello\n");
    12. sleep(4);
    13. printf("time out\n");
    14. exit(0);
    15. }
    16. void sig_alarm(int)
    17. {
    18. printf("alarm time out!\n");
    19. exit(0);
    20. }

    运行结果

    1. [root@localhost Signal]# ./a.out
    2. hello
    3. alarm time out!

    先输出了hello, 然后执行了sleep(), 然而alarm()时间只是2s, 所以2s后触发了sig_alarm()函数, 最后退出, 所以sleep之后的语句就无法执行.

    继续验证

    1. #include <stdio.h>
    2. #include <unistd.h>
    3. #include <stdlib.h>
    4. #include <signal.h>
    5. static void sig_alarm(int);
    6. int main(void)
    7. {
    8. if(signal(SIGALRM, sig_alarm) == SIG_ERR)
    9. fprintf(stderr, "signal(SIGALRM) error");
    10. alarm(4);
    11. for(int i = 0; ; i++)
    12. {
    13. printf("%d\n", i);
    14. sleep(1);
    15. }
    16. exit(0);
    17. }
    18. void sig_alarm(int)
    19. {
    20. printf("alarm time out!\n");
    21. exit(0);
    22. }

    运行结果

    1. [root@localhost Signal]# ./a.out
    2. 0
    3. 1
    4. 2
    5. 3
    6. alarm time out!

    sleep改写

    1. #include <stdio.h>
    2. #include <unistd.h>
    3. #include <stdlib.h>
    4. #include <signal.h>
    5. #include <setjmp.h>
    6. static jmp_buf env_jmp;
    7. static void sig_alrm(int)
    8. {
    9. longjmp(env_jmp, 1);
    10. }
    11. unsigned int sleep2(unsigned int seconds)
    12. {
    13. if(signal(SIGALRM, sig_alrm) == SIG_ERR)
    14. return (seconds);
    15. if(setjmp(env_jmp) == 0)
    16. {
    17. alarm(seconds);
    18. // 等待alarm()结束才能往下执行其他的, 进程阻塞
    19. pause();
    20. }
    21. return alarm(0);
    22. }
    23. int main(void)
    24. {
    25. sleep2(2);
    26. exit(0);
    27. }

    一个read计时程序

    用alarm()定时一个read计时器, 当达到时间后就停止输入, 不一直等待输入.
    在shell编程里面, “read -t sec” 表示sec的时间结束输入

    1. #include <stdio.h>
    2. #include <setjmp.h>
    3. #include "apue.h"
    4. #include <signal.h>
    5. static void sig_alarm(int);
    6. static jmp_buf env_alarm;
    7. int main(void)
    8. {
    9. int n;
    10. char line[MAXLINE];
    11. if(signal(SIGALRM, sig_alarm) == SIG_ERR)
    12. err_sys("signal(SIGALRM) error");
    13. if(setjmp(env_alarm) != 0)
    14. {
    15. err_quit("read timeout");
    16. pause();
    17. }
    18. // 计时, read()时间等待2s
    19. alarm(2);
    20. if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
    21. err_sys("read error");
    22. // 时间到了, alarm(0)返回0, 时间不到就返回剩余时间.
    23. alarm(0);
    24. write(STDOUT_FILENO, line, n);
    25. exit(0);
    26. }
    27. static void sig_alarm(int)
    28. {
    29. printf("time out\n");
    30. longjmp(env_alarm, 1);
    31. }


    展开全文
  • Alarm闹钟Demo

    2016-07-22 22:55:46
    Alarm闹钟Demo,简洁代码
  • Android Alarm闹钟

    2011-08-25 19:51:37
    1,设置闹钟(只响一次) [code="java"] Intent intent = new Intent(AlarmController.this, OneShotAlarm.class); PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,0, intent...
    1,设置闹钟(只响一次)

    Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 30);

    // Schedule the alarm!
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

    2,重复闹钟
    Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,0, intent, 0);

    long firstTime = SystemClock.elapsedRealtime();
    firstTime += 15*1000;

    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstTime, 15*1000, sender);

    3,取消闹钟
    Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,0, intent, 0);

    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.cancel(sender);

    -----------------------------------分割线----------------------------------
    一:OneShotAlarm.class/RepeatingAlarm.class
    另外的Activity(Activity,Service,BroadcastReceiver)

    二:PendingIntent 字面意思是 挂件意图
    英文解释:* A description of an Intent and target action to perform with it.
    * Instances of this class are created with {@link #getActivity},
    * {@link #getBroadcast}, {@link #getService}; the returned object can be
    * handed to other applications so that they can perform the action you
    * described on your behalf at a later time.

    PendingIntent就是一个Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的别的时间做你安排做的事情
    展开全文
  • 在Android API19及以上版本中,Android Alarm机制改变为非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用,也就是以前使用的set()和setRepeating()已经变的不再准确。

    在Android API19及以上版本中,Android Alarm机制改变为非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用,也就是以前使用的set()和setRepeating()已经变的不再准确。

    从API 19以后,则采用了如下方法:

    * setWindow(int, long, long, PendingIntent) 
    * setExact(int, long, PendingIntent) 
    

    从上面的两个方法我们可以看出,没有了repeat,就是设置了闹钟只能响一次了,而且这两种方法都可以设置精确的,第一个相对于第二种方法来说,应该是比较省电的。因为setWindow这个方法允许应用程序利用电池优化来自交货批处理即使它适度的及时性要求警报。

    示例代码如下:

        Intent intent = new Intent(Action);
        PendingIntent sender = PendingIntent.getBroadcast(this,
                    0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    
        long systemTime = System.currentTimeMillis();
        long firstTime = SystemClock.elapsedRealtime();
    
        // Schedule the alarm!
        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        calendar.set(Calendar.HOUR_OF_DAY, mHour);
        calendar.set(Calendar.MINUTE, mMinute);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
    
        long selectTime = calendar.getTimeInMillis();
    
        if (systemTime > selectTime) {
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            selectTime = calendar.getTimeInMillis();
        }
    
        long time = selectTime - systemTime;
        firstTime += time;
        //1000是指允许系统延时执行的时长
        am.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 1000, sender);
    

    想要实现类似setRepeating()的重复执行,就只能在Receiver中再次设置一次闹钟。

    展开全文
  • android Alarm 闹钟

    千次阅读 2012-08-03 20:08:21
    AlarmManager 1.主要功能是在指定的时间执行指定的任务,要注意所有的定时任务在手机重启后会消失,如果需要重启后继续用,可以加个开机自启,然后...AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE); I

    AlarmManager

    1.主要功能是在指定的时间执行指定的任务,要注意所有的定时任务在手机重启后会消失,如果需要重启后继续用,可以加个开机自启,然后重新设置.
    2.用法:设置AlarmManager在指定的时间发送广播,在接收器中写任务
    例子:
    定时广播
    AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
    Intent it=new Intent(context,MyRecevier.class);
    PendingIntent pi=PendingIntent.getBroadcast(this, 0, intent,0);
    am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
    写接收器类,并注册
    <receiver android:name=".MyRecevier" android:process=".myreceiver"/>
    <!--android:process 接收器进程名字,可任意填,不填默认为包名,在网上有网友发表:"真机测试,如果不填,在AlarmManager时间设为过去的时间时,会不停收到广播(死循环)"-->
    3.方法以及常量介绍
    am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
    设置广播什么时候发出,第一个参数表示闹钟的类型,可以为:
    ELAPSED_REALTIME  当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。   
    ELAPSED_REALTIME_WAKEUP 能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。   
    RTC  当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。   
    RTC_WAKEUP 能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。 
    前两者使用相对时间,时间从系统启动开始算起,SystemClock.elapsedRealtime()可以获得当前的相对时间,单位为毫秒,例如:alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, sender);  
    后两者使用绝对时间,时间以1970.1.1号为参考时间,System.currentTimeMillis()获取从1970.1.1号以来的时间,单位为毫秒,例如:alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, sender);  


    am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 10000, pi);
     在上面方法的基础上,添加了重复执行的功能,倒数第二参数为间隔时间,单位为毫秒
     
     am.cancel(pi);//取消已经注册的与参数匹配的闹铃
     public void cancel (PendingIntent operation) 
    Since: API Level 1 Remove any alarms with a matching Intent. Any alarm, of any type, whose Intent matches this one (as defined by filterEquals(Intent)), will be canceled.
     
    void  setTimeZone(String timeZone)   //设置时区  Requires the permission android.permission.SET_TIME_ZONE.
    void  setTime(long millis) //Set the system wall clock time. Requires the permission android.permission.SET_TIME.
     
    PendingIntent Intent的进一步封装,添加了延迟执行功能。两者主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的.还有PendingIntent就是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于context才可以存在。Intent对象里包含了要执行的操作所需要的信息,PendingIntent对象里还包含了要执行什么操作(发出广播,启动界面,...)
    三种不同方式来得到PendingIntent实例。 
    getBroadcast——通过该函数获得的PendingIntent将会扮演一个广播者的功能,就像调用 Context.sendBroadcast()函数一样。当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的 intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION 和CATEGORY等描述让系统自动找到该行为处理对象。 
    Java代码 
    Intent intent = new Intent(AlarmController.this, MyReceiver.class);   
    PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);  

    getActivity——通过该函数获得的PendingIntent可以直接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK. 
    Java代码 
    // The PendingIntent to launch our activity if the user selects this notification   
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,  new Intent(this, AlarmService.class), 0);  


    getService——通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。 

    // Create an IntentSender that will launch our service, to be scheduled  with the alarm manager.

    mAlarmSender = PendingIntent.getService(AlarmService.this , 0 ,  new  Intent(AlarmService.this , AlarmService_Service. class ),  0 );  

    展开全文
  • 1、alarm 返回值 距离上一次闹钟出发剩余秒数第一次设置返回0,第二次设置了返回距离上一个闹钟的剩余的秒数。 [1] 引用头文件:#include <unistd.h>; [2] 函数标准式:unsigned int alarm(unsigned int ...
  • Linux alarm闹钟函数

    2010-12-28 21:11:00
    alarm也称为闹钟函数,一个进程只能有一个闹钟时间,如果在调用alarm之前也设置过闹钟时间,则都会被新值所代替。 alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. 如果不忽略或捕捉此...
  • alarm 闹钟开机时判断

    千次阅读 2016-08-29 22:41:09
    /device/qcom/common/init/init_msm.c:{ char *alarm_file = "/proc/sys/kernel/boot_reason"; char buf[BUF_SIZE]; char tmp[PROP_VALUE_MAX]=""; property_get("ro.boot.alarmboot", tmp); if(re
  • 安卓Alarm闹钟唤醒耗电问题的排查

    千次阅读 2019-04-28 17:34:58
    当厂商反馈我们APP的Alarm唤醒频率太高而没有给出详细信息时,我们往往只有硬着头皮去排查自己代码中Alarm的使用。 不幸的是有时Alarm唤醒频率是第三方SDK造成的,我们自己代码的Alarm并没有问题,排查自己的代码并...
  • android Alarm闹钟发送广播播放音乐

    千次阅读 2015-06-11 15:11:38
    通过网上的例子 自己根据相关功能修改的 如有不合理的地方 请提出来 互相学习 一共有3个类 MainActivity.java 主程序 ...AlarmReceiver.java 广播接收器 ...package com.yqy.yqy_alarm; impor
  • 正如标题所说,给一个alarm设置多个闹钟。。。我遇到的问题思想与这个很类似,听我慢慢说来!(如果你是大牛,那就算了省得浪费你的时间,我只是再为那些遇到问题的新手做一个指引!大牛就路过吧~~~~)。 我们知道...
  • 6.Alarm 闹钟服务

    2014-01-18 15:29:00
     alarm = (AlarmManager)getSystemService(ALARM_SERVICE);// 获取AlarmManager  }  public void registerWidget(){  startAlarm.setOnClickListener(startAlarms);  shutdownAlarm.setOnClickListener...
  • 调用AlarmManager这个类是必须的,自定义个setAlarmTime方法,如下代码:public void setAlarmTime(Context context,long timeInMillis) { AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_...
  • 我在App中通过AlarmManager.set()方法添加了RTC_WAKEUP方式的闹铃,测试如果是按home键返回桌面或是back键退出程序,只要程序还在缓存,那么闹铃都还能起作用,一旦使用了手机的清理内存功能就不起作用了。...
  • 1、用STM32CubeMx配置RCC时钟,高速时钟采用内部HSI,低速时钟采用外部的LSE 2、配置串口用以打印信息验证,只需要Tx就行。 3、配置RTC模式,个人建议 Data Format 选择 Binary ...A、在stm32l0xx_it.c中添加闹钟...
  • 发现从Settings里面点击铃声,其他声音选项和闹钟里面选择铃声都可以进入RingtonePickerActivity 从闹钟里是从AlarmClockFragment点击铃声后进入到RingtonePickerActivity 音频文件的数据库保存在packages/...
  • I/O操作上设置超时之alarm闹钟

    千次阅读 2011-03-01 16:36:00
    环境是linux ubuntu系统 调用 alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理。 用法:  alarm(time):TIME就是指定的超时期;如果之前设有超时期,alarm()会返回其时期的...
  • //秒唤醒时间,必须为5的倍数 Alarm唤醒,Alarm唤醒不进入闹钟中断函数,到时间就自动唤醒后,自动重新设置Alram。stop模式更复杂,会进入中断函数,必须进行中断标志位的清除,否则会影响下一次唤醒。
  • 环境是Linux Ubuntu系统调用 alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理。用法:alarm(time):TIME就是指定的超时期;如果之前设有超时期,alarm()会返回其时期的剩余值;signal(SIGALARM, ...
  • QT闹钟alarm

    2018-11-13 10:54:09
    使用QT构建桌面闹钟程序,可添加多个闹钟,实现QT 2D画图。
  • 目的:主要测试pcntl_alarm的功能测试代码一declare(ticks = 1);function signal_handler($signal) {print "catch you ";pcntl_alarm(5);}pcntl_signal(SIGALRM, "signal_handler", true);pcntl_alarm(5);while(1) {}...
  • 闹钟函数alarm

    2014-10-21 15:48:53
    alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。如果忽略或者不捕获此信号,则其默认动作是终止调用该alarm函数的进程。 中文名 闹钟函数 ...
  • alarm:CLI 闹钟-开源

    2021-06-29 04:49:36
    Alarm 是用 Python 语言编写的命令行闹钟实用程序。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,867
精华内容 5,946
关键字:

alarm闹钟