📄 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;
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall RecThread::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__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->PbReceive->Position=100*ulLengthWrited/filelength;
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdateReceiveEnd(void)
{
// Form1->btnCancelR->Enabled=false;
MessageDlg("发送完毕!", mtInformation, TMsgDlgButtons() << mbOK, 0);
//SerialPort->PbReceive->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));
// aSignal=String(cReceiveBuf);
if(!strcmp(m_ReceiveBuf,"FileFlag"))
{
Synchronize(GetFileSignal);
if(Result)
{
//新建可读写文件
iFileRHandle=FileCreate(FILENAME,fmOpenReadWrite);
if(iFileRHandle==-1)
{
Synchronize(Error);
return;
} // if(iFileHandle<0)
// unsigned long SignalLength;
ReceiveFile=true;
filelength=FileFlag.length;
// strcpy(FileFlag.FileSendFlag,ready);
SendData(m_hComm,"Ready",5,&SignalLength); //发送“准备就绪”信号
// Synchronize(SetCancelR);
} // if(SDEx)
}
else if(!strcmp(m_ReceiveBuf,"Ready"))
{
SetEvent(hReceiveReady);
}
else if(!ReceiveFile)
{
Synchronize(UpdataMemo);
}
else if(!strcmp(m_ReceiveBuf,"CancelR"))
//对方取消文件接收
{
// tcsReadyLock->Acquire();
bReady=false;
// tcsReadyLock->Release();
unsigned long SignalLength;
SendData(m_hComm,"CancelS",7,&SignalLength);
Synchronize(UpdateCancelR);
}
else if(!strcmp(m_ReceiveBuf,"CancelS"))
//取消文件传输
{
FileClose(iFileRHandle);
ulLengthWrited=0;
DeleteFile(filename);
iFileRHandle=-1;
// filename="";
ReceiveFile=false;
Synchronize(UpdateCancelS);
}
else
{
int length=FileWrite(iFileRHandle,m_ReceiveBuf,BytesRead);
ulLengthWrited=ulLengthWrited+length;
Synchronize(UpdatePBReceiveFile);
if(ulLengthWrited>=filelength)
{
FileClose(iFileRHandle);
// filename="";
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);
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdateCancelR()
{
// Form1->btnCancelR->Enabled=false;
//MessageDlg("对方取消发送!", mtInformation, TMsgDlgButtons() << mbOK, 0);
//SerialPort->PbSend->Position=0;
}
//---------------------------------------------------------------------------
void __fastcall RecThread::UpdateCancelS()
{
// Form1->btnCancelR->Enabled=false;
//MessageDlg("发送已取消!", mtInformation, TMsgDlgButtons() << mbOK, 0);
//SerialPort->PbReceive->Position=0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -