📄 recthread.~cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "RecThread.h"
#pragma package(smart_init)
DWORD BytesRead;
char m_ReceiveBuf[1025];
bool Result;
bool ReceiveFile;
bool bReady;
LPOVERLAPPED lpOverlappedRead;
AnsiString aSignal,FILENAME;
unsigned long SignalLength;
unsigned long ulLengthWrited;
unsigned long filelength;
int iFileRHandle;
FILEFLAG FileFlag;
__fastcall RecThread::RecThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdataMemo()
{
SerialPort->Memo->Lines->Add("已收到数据"+IntToStr(BytesRead)+"字节: "+" ("+Date()+" "+Time()+")");
SerialPort->Memo->Lines->Add(m_ReceiveBuf);
SerialPort->Memo->Lines->Add("---------------------------------------------");
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdatePBReceiveFile(void)
{
SerialPort->ProgressBar->Position=100*ulLengthWrited/filelength;
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdateReceiveEnd(void)
{
MessageDlg("发送完毕!", mtInformation, TMsgDlgButtons() << mbOK, 0);
SerialPort->ProgressBar->Position=0;
}
//---------------------------------------------------------------------------
void __fastcall RecThread::Execute()
{
//---- Place thread code here ---
while(true)
{
memset(m_ReceiveBuf,0,sizeof(m_ReceiveBuf));
if(!ReadFile(m_hComm, //串口句柄
m_ReceiveBuf, //输入缓冲区地址
1024, //想读入的字符数
&BytesRead, //实际读出的字节数的变量指针
lpOverlappedRead)) //重叠结构指针
{
if(GetLastError()== ERROR_IO_PENDING)
{
DWORD RESULT;
do
{
RESULT=WaitForSingleObject(lpOverlappedRead->hEvent,1000);
}while(RESULT!=WAIT_OBJECT_0);
if(GetOverlappedResult(m_hComm,lpOverlappedRead,&BytesRead,false))
if(BytesRead>0)
DataDisposal();
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall RecThread::DataDisposal()
{
memcpy(&FileFlag,m_ReceiveBuf,sizeof(FILEFLAG));
if(!strcmp(m_ReceiveBuf,"FileFlag"))
{
Synchronize(GetFileSignal);//读取文件名
if(Result)
{
iFileRHandle=FileCreate(FILENAME,fmOpenReadWrite); //新建可读写文件
if(iFileRHandle==-1)
{//新建文件失败
Synchronize(Error);
return;
}
ReceiveFile=true;
filelength=FileFlag.length;
SendData(m_hComm,"Ready",5,&SignalLength); //发送“准备就绪”信号
} // if(SDEx)
}
else if(!strcmp(m_ReceiveBuf,"Ready"))
{
SetEvent(hReceiveReady);
}
else if(!ReceiveFile)
{
Synchronize(UpdataMemo);
}
else
{
int length=FileWrite(iFileRHandle,m_ReceiveBuf,BytesRead);
ulLengthWrited=ulLengthWrited+length;
Synchronize(UpdatePBReceiveFile);
if(ulLengthWrited>=filelength)
{//如果接收的内容大于文件大小
FileClose(iFileRHandle);
ReceiveFile=false;
ulLengthWrited=0;
Synchronize(UpdateReceiveEnd);
}
}
}
//---------------------------------------------------------------------------
void __fastcall RecThread::GetFileSignal()
{ //读取保存文件的字符串
//---- Place thread code here ----
SerialPort->SaveDialog->FileName=FileFlag.name;
Result=SerialPort->SaveDialog->Execute();
FILENAME=SerialPort->SaveDialog->FileName;
}
//---------------------------------------------------------------------------
void __fastcall RecThread::Error()
{
//---- Place thread code here ----
MessageDlg("新建文件失败!", mtError, TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -