I'm encountering a bit of a problem while reading from the com port in
overlapped mode. The debug messageboxes (with the "Received" messages) are
blank at times etc, they don't show their real texts. My guess is that I
overwrite memory in some way that I shouldn't be overwriting..
Here's the reader thread code (it's fairly standard - a transcript from
msdn - originally in C):
procedure TSerialReader.Execute;
var
osReader: TOVERLAPPED;
hArray: array[0..1] of THandle;
ThreadDone: Boolean;
WaitingOnRead: Boolean;
Buffer: array[0..255] of Char;
dwRes: DWORD;
dwRead: DWORD;
begin
ZeroMemory(Addr(osReader), SizeOf(osReader));
osReader.hEvent := CreateEvent(nil, True, True, nil);
hArray[0] := osReader.hEvent;
hArray[1] := hSigExit;
ThreadDone := False;
WaitingOnRead := False;
while not ThreadDone do
begin
if not WaitingOnRead then
begin
if not ReadFile(hPort, Buffer, SizeOf(Buffer), dwRead, @osReader) then
begin
if GetLastError = ERROR_IO_PENDING then
WaitingOnRead := True;
end else begin
MessageDlg('Received1.', mtInformation, [mbOk], 0);
end;
end;
if True then
begin
dwRes := WaitForMultipleObjects(2, @hArray, False, 200);
case dwRes of
WAIT_OBJECT_0: begin
if GetOverlappedResult(hPort, osReader, dwRead, False) then
begin
MessageDlg('Received2.', mtInformation, [mbOk], 0);
end;
WaitingOnRead := False;
end;
WAIT_OBJECT_0+1: begin
ThreadDone := True;
end;
WAIT_TIMEOUT: begin
end;
end;
end;
end;
MessageDlg('Reader thread exiting.', mtInformation, [mbOk], 0);
CloseHandle(osReader.hEvent);
end;