热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

应用程序轮询(可能会比较耗费CPU资源)

在应用程序开发过程中,有些时候我们需要自己编写demo去测试封装好的底层接口,如果对界面编程有不太熟悉,这时候可以怎么做呢?这里以测试播放器相关的接口为例,编写一个轮询stdin的

在应用程序开发过程中,有些时候我们需要自己编写demo去测试封装好的底层接口,如果对界面编程有不太熟悉,这时候可以怎么做呢?

这里以测试播放器相关的接口为例,编写一个轮询stdin的小demo,用于测试播放器的play、pause、stop、快进快退等接口功能。

int main(int argc, char *argv[])
{
if (argc == 1) {
printf("=============== How to Use %s ====================\n",argv[0]);
printf("%s URL mediatype (1: video 2:image 3:music)\n",argv[0]);
printf("exp:%s /usb/sda/1.avi 1 \n",argv[0]);
printf("exp:%s /usb/sda/1.jpg 2 \n",argv[0]);
printf("exp:%s /usb/sda/1.mp3 3 \n",argv[0]);
return 1;
}

signal(SIGINT, signalHandler);   //这里注册一个Ctrl+c 退出的信号处理函数
printf("\n");
printf("\n");
printf("Set Input source to MM\n");
// AppIpcApi_SetInputSource(E_APPIPC_INPUT_SOURCE_STORAGE,false);
printf("/////////////////////////////////////////////////////////////////////\n");
printf("Start MM Test Code.\n");
printf("/////////////////////////////////////////////////////////////////////\n");
printf("argc=%d\n",argc);

if(argc >= 3) {
switch(atoi(argv[2]))
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
g_mediatype = atoi(argv[2]);
break;
default:
printf("argv[2]=%s\n",argv[2]);
break;
}
}
if (argc >= 2 ){
printf("argv[1]=%s\n",argv[1]);
g_url = argv[1];
MM_test(argv[1]);
} else {
printf("Argument Error Play Default Video\n");
g_mediatype = 1;
MM_test(VideoFile);
}
printf("/////////////////////////////////////////////////////////////////////\n");
printf("End MM Test Code.\n");
printf("/////////////////////////////////////////////////////////////////////\n");
printf("\n");
printf("\n");
return 0;
}

 

static void signalHandler( int signum )
{
  cout <<"Interrupt signal (" <   // cleanup and close up stuff here
  // terminate program
  MM_ReleaseResource();
  exit(signum);
}

static BOOL MM_Callback(void* arg1, void* arg2, void* arg3)
{

  。。。。

  case E_EVENT_INIT_OK:
    MSG_INFO("Get E_EVENT_INIT_OK event.\n");
    g_bInitDOne= TRUE;
    g_bInitResult = TRUE;
    pthread_cond_signal(&condNotify);
    break;

}

 

static void parsecmd(char cmd[][256], char * ch)
{
  int i, j, k;
  int len = strlen(ch);
  k = 0;
  for (i = 0, j = 0; ((i   {
    if ((ch[i] != ' ') && (ch[i] != '\n'))
    {
      cmd[j][k++] = ch[i];
    }
    else
    {
      k = 0;
      j++;
    }
  }
}

static void MM_test(const char* url)
{  

  pthread_mutex_init(&Mutex, NULL);
  pthread_cond_init(&condNotify, NULL);

       //这里一般会注册一些callback 到底层,用于接收底层返回的init等等的一些状态信息,在callback里面会发

       pthread_cond_wait(&condNotify, &Mutex);

 

//前面做好一系列的初始化工作,下面起一个while循环一直去轮询console的stdin,如果有fd有异动,则先把stdin读出来,然后进行parse,再根据自定义的规则进行匹配,然后调用对应的接口进行测试

  while (((g_bDecodeDOne== FALSE) && (g_bDecodeError == FALSE))||stMedia.eMediaType == E_PLAYER_MEDIA_TYPE_PHOTO){
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 0;

    fd_set fs;
    FD_ZERO(&fs);
    FD_SET(STDIN_FILENO, &fs);
    signed int ret = select(STDIN_FILENO+1, &fs, NULL, NULL, &tv);
    if (ret > 0 && FD_ISSET(STDIN_FILENO, &fs))
    {
      //printf("Command: %s\n",cmd[0]);
      memset(ch, 0x00, 256);
      read(STDIN_FILENO, ch, 255);
      memset(cmd[0], 0x00, 256);
      memset(cmd[1], 0x00, 256);
      memset(cmd[2], 0x00, 256);
      memset(cmd[3], 0x00, 256);
      parsecmd(cmd, ch);
      printf("<%s>", cmd[0]);
      printf("<%s>", cmd[1]);
      printf("<%s>", cmd[2]);
      printf("<%s>", cmd[3]);
      if(0 == strcmp(cmd[0], "setscolor"))
      {
        if (strlen(cmd[1]) > 0 && strlen(cmd[2]) > 0&& strlen(cmd[3]) > 0)
        {
          int r = atoi(cmd[1]);
          int g = atoi(cmd[2]);
          int b = atoi(cmd[3]);

          U32 u32Color = (U32)(b<<24) + (U32)(g<<16) + (U32)(r<<8) + (U32)255;
          pMMInterface->MM_SetSubtitleTextColor(g_u32Item, u32Color);
        }
      }

      if(0 == strcmp(cmd[0], "setstrack"))
      {
        if (strlen(cmd[1]) > 0)
        {
          int trackID = atoi(cmd[1]);
          printf("set subtitle track = %d",trackID);
          pMMInterface->MM_SetSubtitleTrackID(g_u32Item,trackID);
        }
      }

      if(0 == strcmp(cmd[0], "voldown"))
      {
        pMMInterface->MM_AudioVolumeDown();
      }

  。。。。

}



推荐阅读
  • 接上文http:blog.itpub.net29254281viewspace-1318239领导让开发同学鼓捣一个可配置化的后台.又回到了原来的问题如果要灵活,很多参数要 ... [详细]
  • IPVlan 详解
    文章目录简介Ipvlan2同节点Ns互通Ns内与宿主机通信第三种方法Ns到节点外部结论Ipvlan31.同节点Ns互通Ns内与宿主机通信Ns内到外部网络总结源码分析ipvlan收包 ... [详细]
  • 如何实现Percona Mysql Galera多读写集群的部署
    本篇文章给大家主要讲的是关于如何实现PerconaMysqlGalera多读写集群的部署的内容,感兴趣的话就一起来看看这篇文章吧,相信看完如何实现PerconaMysq ... [详细]
  • 883.三维形体投影面积
    题目883.三维形体投影面积题目大意在nxn的网格grid中,我们放置了一些与x,y,z三轴对齐的1x1x1立方体。每个值vgri ... [详细]
  • 1,启动MySQL终端输入mysql-uroot-p然后输入密码,启动成功WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMyS ... [详细]
  • 题目大意题目原文:http:uva.onlinejudge.orgexternal10410474.pdf背景还是基本的排序问题,题目意思很简单就是首先 ... [详细]
  • iic协议
    IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S ... [详细]
  • [二分图]JZOJ 4612 游戏
    DescriptionInputOutputSampleInput44#****#****#*xxx#SampleOutput5DataConstraint分析非常眼熟࿰ ... [详细]
  • 这篇文章主要讲解了“GradeBook类怎么定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Grad ... [详细]
  • Proof (of knowledge) of exponentiation
    1.ProofofexponentiationProofofexponentiation是基于adaptiverootassumption(充分必要条件࿰ ... [详细]
  • 编译lib手动编译cmake编译gtest测试程序断言和caseFixture使用gmock编译gmock测试程序参考GtestGithub使用gtest(gmock)方便我们编写 ... [详细]
  • The“travellingsalesmanproblem”asksthefollowingquestion:“Givenalistofcitiesandthedistancesb ... [详细]
  • 为什么需要有应用层缓冲区?muduo网络库使用IO复用,并且文件描述符使用非阻塞模式,如果使用阻塞模式那么read、write就会阻塞在 ... [详细]
  • 在开发四国军棋的游戏中,通过flex联机游戏开发-四国军棋游戏(五)-提炼棋类开发api,我们提炼出了第一个关于棋类游戏开发的api-FlexChessAPI,这个a ... [详细]
  • 1011-MarriageCeremoniesPDF(English)StatisticsForumTimeLimit:2second(s)MemoryLimit:32MBYouw ... [详细]
author-avatar
yaoyinghua2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有