|
#1
|
|||
|
|||
Не работает поток
Доброго времени суток. Помогите пожалуйста разобраться с потоком, сталкиваюсь с этим впервые. Дело в том, что первый пакет данных проходит успешно, маркер определяется, получаю пакет, а затем поток как-то зависает и программа перестает получать данные с ком порта. Если я прохожу по циклу в режиме откладки, то все работает на ура.....
Код:
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; Код не доработан в плане обработки пакета т.к. Нет стабильного приема. Последний раз редактировалось M.A.D.M.A.N., 12.02.2013 в 08:13. |