function TCustomComm.Write(const Buf; Count: Integer): Integer;
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
Lock;
try
FillChar(Overlapped, Sizeof(Overlapped), 0);
Overlapped.hEvent := FEvent.Handle;
if not WriteFile(FHandle, Buf, Count, dWord(Result),
@Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
begin
ErrorCode := GetLastError;
RaiseCommError(sWriteError, ErrorCode);
end;
if FEvent.WaitFor(FWriteTimeout) <> wrSignaled then
Result := -1
else
begin
GetOverlappedResult(Handle, Overlapped, dWord(Result), False);
FEvent.ResetEvent;
end;
finally
Unlock;
end;
end;function TCustomComm.Read(var Buf; Count: Integer): Integer;
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
Lock;
try
FillChar(Overlapped, Sizeof(Overlapped), 0);
Overlapped.hEvent := FEvent.Handle;
if not ReadFile(FHandle, Buf, Count, dWord(Result),
@Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
begin
ErrorCode := GetLastError;
RaiseCommError(sReadError, ErrorCode);
end;
if FEvent.WaitFor(FReadTimeout) <> wrSignaled then
Result := -1
else
begin
GetOverlappedResult(Handle, Overlapped, dWord(Result), False);
FEvent.ResetEvent;
end;
finally
Unlock;
end;
end;
//给个参考吧,好好看看吧,Lock为进入临界区。
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
Lock;
try
FillChar(Overlapped, Sizeof(Overlapped), 0);
Overlapped.hEvent := FEvent.Handle;
if not WriteFile(FHandle, Buf, Count, dWord(Result),
@Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
begin
ErrorCode := GetLastError;
RaiseCommError(sWriteError, ErrorCode);
end;
if FEvent.WaitFor(FWriteTimeout) <> wrSignaled then
Result := -1
else
begin
GetOverlappedResult(Handle, Overlapped, dWord(Result), False);
FEvent.ResetEvent;
end;
finally
Unlock;
end;
end;function TCustomComm.Read(var Buf; Count: Integer): Integer;
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
Lock;
try
FillChar(Overlapped, Sizeof(Overlapped), 0);
Overlapped.hEvent := FEvent.Handle;
if not ReadFile(FHandle, Buf, Count, dWord(Result),
@Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
begin
ErrorCode := GetLastError;
RaiseCommError(sReadError, ErrorCode);
end;
if FEvent.WaitFor(FReadTimeout) <> wrSignaled then
Result := -1
else
begin
GetOverlappedResult(Handle, Overlapped, dWord(Result), False);
FEvent.ResetEvent;
end;
finally
Unlock;
end;
end;
//给个参考吧,好好看看吧,Lock为进入临界区。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货