![]() |
|
|
|
|
#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. |
|
#2
|
||||
|
||||
|
На первый вгляд, а есть увененность, что RXFlag выставляется, сделай CHAR для проверки, посмотри будут ли данные приходить.
Ну и обращения к VCL компонентам из кода потока убери. Нельзя так делать. Последний раз редактировалось Aristarh Dark, 12.02.2013 в 08:28. |
|
#3
|
|||
|
|||
|
Прошу прощения за некорректное оформление кода. С телефона сижу)))
Данные приходят, флаг вроде отрабатывает. Попробую реализовать совет. Как сделаю, отпишусь Попсавил rxchar, как советовали. Все приходит, изменений нет. Я только не понял про VCL. Что не так? MAD: Вам что, в прикол постить по 10 сообщений подряд? Последний раз редактировалось M.A.D.M.A.N., 13.02.2013 в 08:38. Причина: Объединил сообщения |
|
#4
|
||||
|
||||
|
Подобные вызовы:
Код:
Gen.GenForm.Label4.Caption:=IntToStr(i2); |
|
#5
|
|||
|
|||
|
А как передать данные из потока? Поток в отдельном юните реализован
|
|
#6
|
||||
|
||||
|
Если быть внимательным, то при создании юнита для потока там была написана вот такая интересная информация:
Код:
{
Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure qwdqwd.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
or
Synchronize(
procedure
begin
Form1.Caption := 'Updated in thread via an anonymous method'
end
)
);
where an anonymous method is passed.
Similarly, the developer can call the Queue method with similar parameters as
above, instead passing another TThread class as the first parameter, putting
the calling thread in a queue with the other thread.
} |