ThreadComm.cpp
资源名称:第6章 多线程编程.rar [点击查看]
上传用户:gyjjlc
上传日期:2013-03-29
资源大小:2124k
文件大小:3k
源码类别:
多显示器编程
开发平台:
C++ Builder
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "ThreadComm.h"
- #include "UnitMain.h"
- #pragma package(smart_init)
- __fastcall ThreadComm::ThreadComm(bool CreateSuspended)
- : TThread(true)
- {
- //线程终止时自动释放内存
- FreeOnTerminate=true;
- //发送缓冲区的计数器清0
- sendCount=0;
- if(CreateSuspended==false)
- Resume();//启动线程
- }
- //---------------------------------------------------------------------------
- void __fastcall ThreadComm::Execute()
- {
- DWORD dwEvtMask,dwTransfer;
- //等待通信事件函数重叠操作所要求的重叠数据结构
- OVERLAPPED os;
- memset(&os,0,sizeof(OVERLAPPED));
- // 为等待通信事件建立信号事件,手工复位方式,初始状态FALSE
- os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- //设置所要等待的通信事件,收到有效字符或发送缓冲区为空
- if(!SetCommMask(FormMain->COMX->hCom,EV_RXCHAR|EV_TXEMPTY))
- {
- MessageBox(NULL,"设置通信设备控制块数据结构操作异常!","错误",MB_OK);
- return;
- }
- //线程终止标志无效,一直循环
- while(!Terminated)
- {
- dwEvtMask=0;
- //等待设定的通信事件发生
- if (!WaitCommEvent(FormMain->COMX->hCom, &dwEvtMask, &os))
- {
- //重叠操作处于后台执行的情况
- if(GetLastError()==ERROR_IO_PENDING)
- {
- if(GetOverlappedResult(FormMain->COMX->hCom,&os,&dwTransfer,TRUE))//;
- os.Offset+=dwTransfer;
- }
- }
- //收到有效字符事件发生
- if ((dwEvtMask & EV_RXCHAR)==EV_RXCHAR)
- {
- recvBuffer=FormMain->COMX->ReceiveProcess();
- if(!recvBuffer.IsEmpty())
- {
- //收到字符送主窗体
- Synchronize(AddToMemo);
- }
- }
- //发送缓冲区空,即可以发送的情况
- if((sendCount>0)&&((dwEvtMask & EV_TXEMPTY)==EV_TXEMPTY))
- {
- //将发送缓冲区中当前位置的字符发送出去
- SendOneByte();
- }
- }
- MessageBox(NULL,"线程终止!","信息",MB_OK);
- }
- //---------------------------------------------------------------------------
- //为线程同步函数所调用
- void __fastcall ThreadComm::AddToMemo(void)
- {
- //调主窗体成员函数,将收到字符串送主窗体的有关的VCL控件
- FormMain->CommInputProc(recvBuffer);
- }
- //---------------------------------------------------------------------------
- //将发送缓冲区中当前位置的字符发送出去,发送缓冲区计数器减1
- bool __fastcall ThreadComm::SendOneByte(void)
- {
- bool bCode;
- //调用块发送函数将发送缓冲区中当前位置的字符发送出去
- bCode=FormMain->COMX->WriteCommBlock(sendBuffer.SubString
- (sendBuffer.Length()-sendCount+1,1).c_str(),1);
- if(bCode)sendCount--;
- return bCode;
- }
English
