|
|
#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. } Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |