Post Jobs

API桌面通知功能,eventfd使用说明

Linux 新的API signalfd、timerfd、eventfd使用说明

HTML5实现Notification API桌面通知功能,html5notification

为什么需要HTML5的桌面通知
传统的桌面通知可以写一个div放到页面右下角自动弹出来,并通过轮询等等其他方式去获取消息并推送给用户。这种方式有个弊端就是:当我在使用京东
进行购物的时候,我是不知道人人网有消息推送过来给我的,而必须要等我把当前页面切到人人网才知道有消息推送了。这种方式的消息推送它是基于页面存活的,
但是我们需要这么一种策略:无论你在看哪个页面,只要有消息都应该能推送给我看到,这就是webkitNotification要解决的问题。
Notification生成的消息不依附于某个页面,仅仅依附于浏览器。
一个桌面通知生成的正常流程 我们先来看看一个桌面通知是如何生成的:
1.检查浏览器是否支持Notification
2.检查浏览器的通知权限(是否允许通知)
3.若权限不够则获取浏览器的通知权限
4.创建消息通知
5.展示消息通知
NOTE:关于第一点的说明需要做一些说明,Notification目前还没有标准化,所以目前只支持chrome19+和safari6+;网上有资料显示Firefox26+也支持,但是我拿我的Firefox27检测的结果是无法支持。
html5的桌面通知我相信大家并不陌生。常见的有网页版的微信等应用,需要设置桌面通知功能才可以使用。
用客户端程序实现这样的功能并不难。而传统的网页版的桌面通知可以写一个div放到页面右下角自动弹出来,并通过轮询等等其他方式去获取消息并推送给用户。这种方式有个弊端就是:当我在使用淘宝进行购物的时候,我是不知道微博有消息推送过来给我的,而必须要等我把当前页面切到新浪微博才知道有消息推送了。这种方式的消息推送它是基于页面存活的,
但是我们需要这么一种策略:无论你在看哪个页面,只要有消息都应该能推送给我看到,这就是webkitNotification要解决的问题。
Notification目前还没有标准化,所以你在w3cschool等网站上是学习不到的。但是目前主流浏览器大部分都支持Notification。关于html5的桌面通知效果图如下:

图片 1

 
代码如下:
XML/HTML Code复制内容到剪贴板

  1. <!DOCTYPE html>    
  2. <html>    
  3. <head>    
  4. <meta charset=”utf-8″> 
      
  5. <title>html5桌面通知</title>    
  6. </head>    
  7. <body>    
  8. <input type=”button” value=”开启桌面通知” onclick=”showNotice();”>    
  9. <script>    
  10. function showNotice(){    
  11. Notification.requestPermission(function(status){    
  12. //status默认值’default’等同于拒绝 ‘denied’ 意味着用户不想要通知 ‘granted’ 意味着用户同意启用通知 
      
  13. if(“granted” != status)    
  14. return;    
  15. var notify = new Notification(“消息”,{    
  16. dir:’auto’,    
  17. lang:’zh-CN’,    
  18. tag:’sds’,//实例化的notification的id    
  19. //icon 支持ico、png、jpg、jpeg格式    
  20. icon:’    
  21. body:’html5桌面通知’ //通知的具体内容    
  22. });    
  23. notify.onclick=function(){    
  24. //如果通知消息被点击,通知窗口将被激活    
  25. window.focus();    
  26. }    
  27. });    
  28. }    
  29. </script>    
  30. </body>    
  31. </html> 

以上内容是小编给大家分享的HTML5实现Notification
API桌面通知功能,希望对大家有所帮助!
原文:

API桌面通知功能,html5notification 为什么需要HTML5的桌面通知
传统的桌面通知可以写一个div放到页面右下角自动弹出来,并…

jQuery cxDialog 对话框,jquerycxdialog

cxDialog 是基于 jQuery 的对话框插件,支持自定义外观样式,同时兼容
Zepto,方便在移动端使用。

  • 版本:
  • jQuery v1.7+ | Zepto v1.0+
  • jQuery cxDialog v1.2.2

  • github地址

* 兼容 Zepto,需要 data 模块 支持

Linux 新的API signalfd、timerfd、eventfd使用说明

三种新的fd加入linux内核的的版本:

signalfd:2.6.22

timerfd:2.6.25

eventfd:2.6.22

三种fd的意义:

lsignalfd

传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、poll、epoll等监听队列中。

ltimerfd

可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期时可以对其read,这样也可以放到监听队列的主循环中。

leventfd

实现了线程之间事件通知的方式,也可以用于用户态和内核通信。eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。

三种新的fd都可以进行监听,当有事件触发时,有可读事件发生。

在线实例

实例预览 基础示例

实例预览 内容设定

实例预览 添加按钮

实例预览 外观样式

实例预览 API 接口

实例预览 支持 AMD 规范

实例预览 兼容 Zepto

signalfd涉及API:

#include  
 int signalfd(int fd, const sigset_t *mask, int flags);

参数fd:如果是-1则表示新建一个,如果是一个已经存在的则表示修改signalfd所关联的信号;

参数mask:信号集合;

参数flag:内核版本2.6.27以后支持SFD_NONBLOCK、SFD_CLOEXEC;

成功返回文件描述符,返回的fd支持以下操作:read、select(poll、epoll)、close

l例子

 #include  
  #include  
#include  
 #include  
 #include  

 #define handle_error(msg) \ 
do { perror(msg); exit(EXIT_FAILURE); } while (0) 

int main(int argc, char *argv[]) 
{ 
 sigset_t mask; 
 int sfd; 
 struct signalfd_siginfo fdsi; 
 ssize_t s; 

 sigemptyset(&mask); 
 sigaddset(&mask, SIGINT); 
 sigaddset(&mask, SIGQUIT); 

 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) 
   handle_error("sigprocmask"); 

 sfd = signalfd(-1, &mask, 0); 
 if (sfd == -1) 
   handle_error("signalfd"); 

 for (;;) { 
   s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo)); 
   if (s != sizeof(struct signalfd_siginfo)) 
     handle_error("read"); 

   if (fdsi.ssi_signo == SIGINT) { 
     printf("Got SIGINT\n"); 
   } else if (fdsi.ssi_signo == SIGQUIT) { 
   printf("Got SIGQUIT\n"); 
   exit(EXIT_SUCCESS); 
   } else { 
   printf("Read unexpected signal\n"); 
   } 
  } 
 }

L17-L21:将感兴趣的信号加入到sigset_t中;

L24:调用signalfd,把信号集与fd关联起来,第一个参数为-1表示新建一个signalfd,不是-1并且是一个合法的signalfd表示向其添加新的信号。

L29:阻塞等待信号的发生并读取。根据读取的结果可以知道发生了什么信号。

默认效果

  1. $.cxDialog(‘Hello World!’);

复制

timerfd涉及的API

#include  
 int timerfd_create(int clockid, int flags); 
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value,struct itimerspec *old_value); 
int timerfd_gettime(int fd, struct itimerspec *curr_value);

timerfd_create:创建一个timerfd;返回的fd可以进行如下操作:read、select(poll、epoll)、close

timerfd_settime:设置timer的周期,以及起始间隔

timerfd_gettime:获取到期时间。

//函数参数中数据结构如下: 
 struct timespec 
{ 
time_t tv_sec; /* Seconds */ 
long   tv_nsec; /* Nanoseconds */ 
}; 
struct itimerspec 
{ 
struct timespec it_interval; /* Interval for periodic timer */ 
struct timespec it_value; /* Initial expiration */ 
};

l例子

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include /* Definition of uint64_t */
  8. #define handle_error(msg) \
  9. do { perror(msg); exit(EXIT_FAILURE); } while (0)
  10. void printTime()
  11. {
  12. struct timeval tv;
  13. gettimeofday(&tv, NULL);
  14. printf(“printTime: current time:%ld.%ld “, tv.tv_sec,
    tv.tv_usec);
  15. }
  16. int main(int argc, char *argv[])
  17. {
  18. struct timespec now;
  19. if (clock_gettime(CLOCK_REALTIME, &now) == -1)
  20. handle_error(“clock_gettime”);
  21. struct itimerspec new_value;
  22. new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);
  23. new_value.it_value.tv_nsec = now.tv_nsec;
  24. new_value.it_interval.tv_sec = atoi(argv[2]);
  25. new_value.it_interval.tv_nsec = 0;
  26. int fd = timerfd_create(CLOCK_REALTIME, 0);
  27. if (fd == -1)
  28. handle_error(“timerfd_create”);
  29. if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) ==
    -1)
  30. handle_error(“timerfd_settime”);
  31. printTime();
  32. printf(“timer started\n”);
  33. for (uint64_t tot_exp = 0; tot_exp < atoi(argv[3]);)
  34. {
  35. uint64_t exp;
  36. ssize_t s = read(fd, &exp, sizeof(uint64_t));
  37. if (s != sizeof(uint64_t))
  38. handle_error(“read”);
  39. tot_exp += exp;
  40. printTime();
  41. printf(“read: %llu; total=%llu\n”,exp, tot_exp);
  42. }
  43. exit(EXIT_SUCCESS);
  44. }

代码L25-L29:初始化定时器的参数,初始间隔与定时间隔。

L32:创建定时器fd,CLOCK_REALTIME:真实时间类型,修改时钟会影响定时器;CLOCK_MONOTONIC:相对时间类型,修改时钟不影响定时器。

L35:设置定时器的值。

L44:阻塞等待定时器到期。返回值是未处理的到期次数。比如定时间隔为2秒,但过了10秒才去读取,则读取的值是5。

编译运行:编译时要加rt库(g++ -lrt timerfd.cc -o timerfd)

[[email protected]
appTest]# ./timerfd 5 2 10
printTime: current time:1357391736.146196 timer started
printTime: current time:1357391741.153430 read: 1; total=1
printTime: current time:1357391743.146550 read: 1; total=2
printTime: current time:1357391745.151483 read: 1; total=3
printTime: current time:1357391747.161155 read: 1; total=4
printTime: current time:1357391749.153934 read: 1; total=5
printTime: current time:1357391751.157309 read: 1; total=6
printTime: current time:1357391753.158384 read: 1; total=7
printTime: current time:1357391755.150470 read: 1; total=8
printTime: current time:1357391757.150253 read: 1; total=9
printTime: current time:1357391759.149954 read: 1; total=10
[[email protected]
appTest]#

第一个参数5为第一次定时器到期间隔,第二个参数2为定时器的间隔,第三个参数为定时器到期10次则退出。程序运行(5+2*10)S退出。

详细信息可以:man timerfd_create

模态对话框

  1. $.cxDialog({
  2. title: 'cxDialog',
  3. info: '欢迎使用 cxDialog 对话框!',
  4. lockScroll: true,
  5. background: '#000'
  6. });

复制

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图