Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1002726
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-09-04 22:16:08

在处理SDL的事件有两种模式,一种是等待 SDL_WaitEvent,另一种是轮询SDL_PollEvent
目前,在网上可以查到的文章,大多数都使用了轮询,还有人指出等待有时会导致事件处理延迟。但是我在实际coding中,使用SDL_PollEvent,一运行就风扇不停的转,用top看了下,cpu占用到了99%。
实际上,使用wait已经足够,我不大清楚这种轮询机制在什么时候会用到。

以下是一个SDL_PollEvent的原型。分析一下这段程序:
在while(quit!=1)这个循环中,如果没有发生任何事件,quit始终为0,那么在用户没有任何操作的情况下,这里会无限循环,直到event发生,进入了SDL_PollEvent的循环中。
这就导致了cpu占用率达到了100%. 因此,这种方法是不可取的。
在外层有循环时,SDL_PollEvent论询是不能用的。如果单独使用,用户无操作的时候,又无法进入处理事件的部分。实在不能明白它有什么用。 
我考虑是不是这个应该用在非实时处理的时候,比如while(quit!=1)循环中嵌入一个sleep(1)之类。

点击(此处)折叠或打开

  1. void WaitKeyboard(SubWin sw){
  2.     int quit = 0;
  3.     SDL_Event event;
  4.     KEYBOARDMODE kmode = COMMAND;
  5.     while(quit!=1){
  6.         //        printf ( "waiting for keyboard action\n" );
  7.      while( SDL_PollEvent(&event)){
  8.         
  9.         printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
  10.         switch (event.type){
  11.             case SDL_KEYDOWN:
  12.                 printf ( "tracking keydown\n" );
  13.                 kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
  14.                 break;
  15.             case SDL_QUIT:
  16.                 printf("Stop !\n");
  17.                 quit = 1;
  18.                 break;
  19.         }
  20.           }
  21.     }
  22.     endSDL();
  23. }

接下来是SDL_WaitEvent的原型
在while(quit!=1)的循环中,由于SDL_WaitEvent语句,在用户未发生任何操作前,程序处于等待状态,不会进入下一次循环,这样就避免了cpu占用的问题。
这样的做法才是正确处理SDL事件的方法。

点击(此处)折叠或打开

  1. void WaitKeyboard(SubWin sw){
  2.     int quit = 0;
  3.     SDL_Event event;
  4.     KEYBOARDMODE kmode = COMMAND;
  5.     while(quit!=1){
  6.         //        printf ( "waiting for keyboard action\n" );
  7.         //        while( SDL_PollEvent(&event)){
  8.         SDL_WaitEvent(&event);
  9.         printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
  10.         switch (event.type){
  11.             case SDL_KEYDOWN:
  12.                 printf ( "tracking keydown\n" );
  13.                 kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
  14.                 break;
  15.             case SDL_QUIT:
  16.                 printf("stop !\n");
  17.                 quit = 1;
  18.                 break;
  19.         }
  20.     }
  21.     endSDL();
  22.     }

 点击(此处)折叠或打开


阅读(14105) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

maxiaoqing192015-06-20 10:02:15

如果是多线程的话,这个方法比较不错。

钟耀鑫2014-06-24 17:56:25

好啊!!!!不错

钟耀鑫2014-06-24 17:56:10

很牛逼!