Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовые / 1 / INTERFACE

.CPP
Скачиваний:
14
Добавлен:
17.04.2013
Размер:
3.11 Кб
Скачать
////////////////////////////////////////////////////////////
//
//  interface.cpp
//

#include "stdafx.h"
#include "interface.h"


BOOL PostMessage(BUFFER* buf, DWORD Id, UINT Msg, DWORD receiver, WORD Param)
/*+
    BUFFER* buf         - buffer where message post to
    DWORD   Id          - process ID posting message
    UINT    Msg         - message
    DWORD   receiver    - message receiver process ID
    return              - TRUE if successful, otherwise FALSE
-*/
{
  for (int i = 0; i <= QUEUE_SIZE; i++)
  {
    if (!buf->m_Messages[i].m_Used)
    {
      buf->m_Messages[i].m_Used = TRUE;
      buf->m_Messages[i].m_Next = NULL;
      buf->m_Messages[i].m_Receiver = receiver;
      buf->m_Messages[i].m_Message = Msg;
      buf->m_Messages[i].m_Param = Param;
      buf->m_Messages[i].m_Sender = Id;
      if (buf->m_Tail)
      {
        buf->m_Tail->m_Next = &buf->m_Messages[i];
        buf->m_Tail = &buf->m_Messages[i];
      }
      else
      {
        buf->m_Head = buf->m_Tail = &buf->m_Messages[i];
      }
      return TRUE;
    }
  }
  ASSERT(0);
  return FALSE;
}

BOOL PeekMessage(BUFFER* buf, DWORD Id, UINT Msg, DWORD& sender, WORD& Param)
/*+
    BUFFER* buf             - beffer where message dispath from
    DWORD   Id              - process ID dispatching message
    UINT    Msg             - message
    return                  - FALSE if not successful, otherwise TRUE
    DWORD&  sender          - message sender
-*/
{
  QUEUE_ELEM* cur   = buf->m_Head;
  QUEUE_ELEM* prev  = NULL;
  while (cur)
  {
    if ((cur->m_Receiver == Id) && (cur->m_Message == Msg))
    {
      ASSERT(cur->m_Used);
      cur->m_Used = FALSE;
      if (prev)
      {
        prev->m_Next = cur->m_Next;
        if (!prev->m_Next) buf->m_Tail = prev;
      }
      else
      {
        buf->m_Head = cur->m_Next;
        if (!buf->m_Head) buf->m_Tail = buf->m_Head;
      }      
      sender = cur->m_Sender;
      Param = cur->m_Param;
      return TRUE;
    }
    prev = cur;
    cur = cur->m_Next;
  }  
  return FALSE;
}

BOOL DispatchMessage(BUFFER* buf, DWORD Id, UINT& Msg, DWORD& sender, WORD& Param)
/*+
    BUFFER* buf             - beffer where message dispath from
    DWORD   Id              - process ID dispatching message
    return                  - FALSE if not successful, otherwise TRUE
    UINT&   Msg             - message
    DWORD&  sender          - message sender
-*/
{
  QUEUE_ELEM* cur   = buf->m_Head;
  QUEUE_ELEM* prev  = NULL;
  while (cur)
  {
    if (cur->m_Receiver == Id)
    {
      ASSERT(cur->m_Used);
      cur->m_Used = FALSE;
      if (prev)
      {
        prev->m_Next = cur->m_Next;
        if (!prev->m_Next) buf->m_Tail = prev;
      }
      else
      {
        buf->m_Head = cur->m_Next;
        if (!buf->m_Head) buf->m_Tail = buf->m_Head;
      }
      Msg = cur->m_Message;
      sender = cur->m_Sender;
      Param = cur->m_Param;
      return TRUE;
    }
    prev = cur;
    cur = cur->m_Next;
  }
  return FALSE;
}
Соседние файлы в папке 1