消息==任务?解释一个问题

来源:互联网 发布:红米note2网络设置 编辑:程序博客网 时间:2024/04/28 08:08

有同学提问:

最近头晕,稍微看了下这方面的书,发现好多相似之处。
怀疑
1,消息==任务?
2,MSG是一个死循环,TASK也是一个死循环?

他们到底是何方神圣?

 

回复如下:

 

举个例子:
main()
{
  printf("Hello the world!/n");
}

这个简单的程序,在运行时,就是操作系统启动一个task,打印完Hello the world后,task就结束了,程序也就退出了。
原因:你的task是个单线任务,执行完毕后,立即结束。如果要使你的程序一直处于工作状态,那就需要加上while循环,直到你的条件满足退出条件。
如:
main()
{
  while(1)
  {
  printf("Hello the world!/n");
  }
}
这个程序是确实是一个死循环,而且没有输入的死循环,一直打印输出,此时CPU的一个核心(多核CPU)将一直被这个task占用。但是,这个循环达到了一个目的:task可以一直处于工作状态,而不是单线的执行完毕就退出了。而往往我们很多工作任务就需要达到这样的目的。如果希望该任务不会把CPU时间全部占用,可以在while执行体中,加上sleep(10);就可以起到明显的作用。

你提出的MSG含义,应该是一个基于消息机制的任务。
例如:
while(getmsg(...))
{
  switch(idMsg)
  {
  case TIMEROUT:
  ...
  break;
  ...
  }
  ...
}
getmsg的作用就是读取消息,while主体中是用来分析消息并处理该消息输入的内容。一般情况下,getmsg返回非0值。如果getmsg返回0,则该任务就退出工作了。windows系统开发的大多界面任务也就是这种任务。
实质上,MSG的消息机制,是由其它任务或者是操作系统触发的一些事件,需要发送给getmsg的这个任务来执行,如定时器到了,鼠标点击了,等等事件,这些事件用统一的定义规则来设计,并驱动各个任务执行。所以消息驱动的机制一般就是一个任务触发消息给另一个或自身任务来处理的多任务机制。由此看来,getmsg任务是一个阻塞型任务,如果没有消息,那么这个任务就被CPU放入休眠队列,直到有消息触发,getmsg才返回,并继续运行,而不像前面例子那样,把CPU时间全部占用。

试想,如果不用while循环,那么这个任务还会不会达到循环运行的目的呢?

先简单说明这么多,应该可以给你一个清晰的认识了。如果希望深入的研究,你可以多看看资料。

原创粉丝点击