ThreadComm.cpp
上传用户:gyjjlc
上传日期:2013-03-29
资源大小:2124k
文件大小:3k
源码类别:

多显示器编程

开发平台:

C++ Builder

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "ThreadComm.h"
  5. #include "UnitMain.h"
  6. #pragma package(smart_init)
  7. __fastcall ThreadComm::ThreadComm(bool CreateSuspended)
  8.     : TThread(true)
  9. {
  10.     //线程终止时自动释放内存
  11.     FreeOnTerminate=true;
  12.     //发送缓冲区的计数器清0
  13.     sendCount=0;
  14.     if(CreateSuspended==false)
  15.         Resume();//启动线程
  16. }
  17. //---------------------------------------------------------------------------
  18. void __fastcall ThreadComm::Execute()
  19. {
  20.     DWORD dwEvtMask,dwTransfer;
  21.     //等待通信事件函数重叠操作所要求的重叠数据结构
  22.     OVERLAPPED  os;
  23.     memset(&os,0,sizeof(OVERLAPPED));
  24.     // 为等待通信事件建立信号事件,手工复位方式,初始状态FALSE
  25.     os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  26.     //设置所要等待的通信事件,收到有效字符或发送缓冲区为空
  27.     if(!SetCommMask(FormMain->COMX->hCom,EV_RXCHAR|EV_TXEMPTY))
  28.     {
  29.         MessageBox(NULL,"设置通信设备控制块数据结构操作异常!","错误",MB_OK);
  30.         return;
  31.     }
  32.     //线程终止标志无效,一直循环
  33.     while(!Terminated)
  34.     {
  35.         dwEvtMask=0;
  36.         //等待设定的通信事件发生
  37.         if (!WaitCommEvent(FormMain->COMX->hCom, &dwEvtMask, &os))
  38.         {
  39.             //重叠操作处于后台执行的情况
  40.             if(GetLastError()==ERROR_IO_PENDING)
  41.             {
  42.                 if(GetOverlappedResult(FormMain->COMX->hCom,&os,&dwTransfer,TRUE))//;
  43.                     os.Offset+=dwTransfer;
  44.             }
  45.         }
  46.         //收到有效字符事件发生
  47.         if ((dwEvtMask & EV_RXCHAR)==EV_RXCHAR)
  48.         {
  49.             recvBuffer=FormMain->COMX->ReceiveProcess();
  50.             if(!recvBuffer.IsEmpty())
  51.             {
  52.                 //收到字符送主窗体
  53.                 Synchronize(AddToMemo);
  54.             }
  55.         }
  56.         //发送缓冲区空,即可以发送的情况
  57.         if((sendCount>0)&&((dwEvtMask & EV_TXEMPTY)==EV_TXEMPTY))
  58.         {
  59.             //将发送缓冲区中当前位置的字符发送出去
  60.             SendOneByte();
  61.         }
  62.     }
  63.     MessageBox(NULL,"线程终止!","信息",MB_OK);
  64. }
  65. //---------------------------------------------------------------------------
  66. //为线程同步函数所调用
  67. void __fastcall ThreadComm::AddToMemo(void)
  68. {
  69.     //调主窗体成员函数,将收到字符串送主窗体的有关的VCL控件
  70.     FormMain->CommInputProc(recvBuffer);
  71. }
  72. //---------------------------------------------------------------------------
  73. //将发送缓冲区中当前位置的字符发送出去,发送缓冲区计数器减1
  74. bool __fastcall ThreadComm::SendOneByte(void)
  75. {
  76.     bool bCode;
  77.     //调用块发送函数将发送缓冲区中当前位置的字符发送出去
  78.     bCode=FormMain->COMX->WriteCommBlock(sendBuffer.SubString
  79.         (sendBuffer.Length()-sendCount+1,1).c_str(),1);
  80.     if(bCode)sendCount--;
  81.     return bCode;
  82. }