12.02.2013, 04:51
|
Прохожий
|
|
Регистрация: 28.05.2010
Сообщения: 7
Версия Delphi: RADStudio 10
Репутация: 10
|
|
Не работает поток
Доброго времени суток. Помогите пожалуйста разобраться с потоком, сталкиваюсь с этим впервые. Дело в том, что первый пакет данных проходит успешно, маркер определяется, получаю пакет, а затем поток как-то зависает и программа перестает получать данные с ком порта. Если я прохожу по циклу в режиме откладки, то все работает на ура.....
Код:
unit ReadPort;
interface
uses
Classes,Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
RdThread = class(TThread)
Private
Protected
Procedure Execute; override;
// Procedure UpdateGenFormnReadLabel;
End;
var
RC: array [1..38]of byte;
i2:integer;
implementation
uses Gen;
Var
RCBuffer:Array of Byte;
nToRead:Cardinal;
nRead:Cardinal;
ComStat:TcomStat;
Errs:Cardinal;
RdOvr:TOverlapped;
Mask:DWord;
Procedure RDthread.Execute;
var
i:integer;
Begin
i2:=0;
FillChar(RdOvr,SizeOf(TOverlapped),0);
RdOvr.hEvent:=CreateEvent(nil,
true,
false,
nil
);
SetCommMask(Port,
EV_RXFLAG);
while not Terminated Do Begin
WaitCommEvent(Port,
mask,
@rdOvr
);
FreeMem(RCBuffer,nToRead);
WaitForSingleObject(RdOvr.hEvent,INFINITE);
GetOverlappedResult(Port,RdOvr,nRead,false);
ClearCommError(Port,Errs,@ComStat);
nToRead:=ComStat.cbInQue;
GetMem(RcBuffer,nToRead);
If not ReadFile(Port,RCBuffer[0],nToRead,nRead,@RdOvr) Then
Else
If nToRead = 8 Then
Begin
For i:=0 to nToRead-1 do
Begin
i2:=i2+1;
RC[i2]:=RCBuffer[i];
end;
end
Else
Begin
If nToRead = 31 Then
Begin
i2:=8;
For i:=0 to nToRead-1 do
Begin
i2:=i2+1;
RC[i2]:=RCBuffer[i];
Gen.GenForm.Label4.Caption:=IntToStr(i2);
end;
Begin
i2:=0;
Gen.PortDataRecived;
End;
End;
end;
i2:=0;
End;
End;
MAD: Пользуемся тегом CODE для оформления кода!
Код не доработан в плане обработки пакета т.к. Нет стабильного приема.
|