消息机制编程

生产消息,处理消息

#include
“stdio.h”

#include
“stdlib.h”

 
 

#define
MSG_TASK1_RUN 1

#define
MSG_TASK1_STOP 2

#define
MSG_TASK2_RUN 1

#define
MSG_TASK2_STOP 2

 
 

void main()

{

    unsigned
int RandTaskGene1;

    unsigned
char message1;

    unsigned
int RandTaskGene2;

    unsigned
char message2;

 
 

    while (1)

    {

        RandTaskGene1 = rand();    

        RandTaskGene1 %= 2;

        if (RandTaskGene1) //产生消息

        {

            message1 = MSG_TASK1_RUN;

        }

        else

        {

            message1 = MSG_TASK1_STOP;

        }

 
 

        RandTaskGene2 = rand();

        if (RandTaskGene2 > 1000)

        {

            message2 = MSG_TASK2_RUN;

        }

        else

        {

            message2 = MSG_TASK2_STOP;

        }

 
 

        if(message1)//检索消息

        {

            switch(message1)

            {

                case
MSG_TASK1_RUN:

                    printf(消息1事件1%d\n”, RandTaskGene1);

                    break;

                case
MSG_TASK1_STOP:

                    printf(消息1事件2%d\n”, RandTaskGene1);

                    break;

            }

        }

        if (message2)//检索消息

        {

            switch (message2)

            {

                case
MSG_TASK2_RUN:

                    printf(消息2事件1%d\n”, RandTaskGene2);

                    break;

                case
MSG_TASK2_STOP:

                    printf(消息2事件2%d\n”, RandTaskGene2);

                    break;

            }

        }

    }

}

消息进入队列处理

#include
“stdio.h”

#include
“stdlib.h”

 
 

typedef
unsigned
char
message;

 
 

//无消息

#define
MSG_NONE 0

 
 

#define
MSG_TASK1_RUN 1

#define
MSG_TASK1_STOP 2

#define
MSG_TASK2_RUN 3

#define
MSG_TASK2_STOP 4

 
 

/*消息处理机制定义*/

#define
QUEUELEN 5 //
消息缓冲区大小

unsigned
char Messages[QUEUELEN]; //
消息队列

unsigned
char MessageHead = 0; //
消息队列头

unsigned
char MessageTail = 0; //
消息列尾

//消息发布

void PutMessage(message
m)

{

    Messages[MessageTail] = m;

    if(++MessageTail>=QUEUELEN)

    {

        MessageTail = 0;

    }

}

//取消息

message GetMessage()

{

    message m = Messages[MessageHead];

    if (++MessageHead>=QUEUELEN)

    {

        MessageHead = 0;

    }

    return m;

}

//判断队列是否为空

bool QueueEmptyOrError()

{

    return (MessageHead == MessageTail) ? 1 : 0;

}

 
 

void main()

{

    unsigned
int RandTaskGene;

 
 

    while (1)

    {

        RandTaskGene = rand();    

        RandTaskGene %= 2;

        if (RandTaskGene) //产生消息

        {

            PutMessage( MSG_TASK1_RUN);

        }

        else

        {

            PutMessage( MSG_TASK1_STOP);

        }

 
 

        RandTaskGene = rand();

        if (RandTaskGene > 1000)

        {

            PutMessage( MSG_TASK2_RUN);

        }

        else

        {

            PutMessage(MSG_TASK2_STOP);

        }

 
 

        while(!QueueEmptyOrError())//一次性处理消息

        {

            switch (GetMessage())

            {

                case
MSG_TASK1_RUN:

                    printf(消息1事件1%d\n”, MSG_TASK1_RUN);

                    break;

                case
MSG_TASK1_STOP:

                    printf(消息1事件2%d\n”, MSG_TASK1_STOP);

                    break;

                case
MSG_TASK2_RUN:

                    printf(消息2事件1%d\n”, MSG_TASK2_RUN);

                    break;

                case
MSG_TASK2_STOP:

                    printf(消息2事件1%d\n”, MSG_TASK2_STOP);

                    break;

            }

        }

    }

}

 
 

 
 

  

发表回复

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