-
Дельфи и Owen OnLine
Привет!
У нас проблема с подключением прибора Owen TRM202 через потоки
вот исходный текст
Код:
unit ThRead1;
interface
uses
Classes,TIOOwenLib,Math,SysUtils,Windows;
type
TReadTEM1 = class(TThread)
private
{ Private declarations }
protected
function InitLib:Boolean;
procedure Execute; override;
function AOpenPort:Boolean;
end;
var S:Single;
Opened:Boolean=False;
implementation
uses Unit1;
{ 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 TReadTEM1.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TReadTEM1 }
function TReadTEM1.AOpenPort: Boolean;
begin
Result:=False;
if(OpenPort(0,2,0,1,0,0)<0) then
begin
// MessageDlg('Error open port!!!',mtError,[mbOK],0);
Exit;
end;
Result:=True;
end;
procedure TReadTEM1.Execute;
begin
{ Place thread code here }
if not Opened then
if(OpenPort(0,2,0,1,0,0)<0) then
begin
Exit;
end else Opened:=True;
res:=ReadFloat24(26,0,'Pv',S,-1);
if res>=0 then
frmMain.RzLEDDisplay1.Caption:=FloatToStr(RoundTo(S,-2))
else
frmMain.RzLEDDisplay1.Caption:='ERROR';
end;
Нам в потоке приходится постоянно открывать порт в следствии этого загружется машина. Вариант с таймером не подходить:(
PS. Одна программа должна считывать данные с 10 приборов в режиме
OnLine. Помогите. Спасибо.
-
Не понятно что мешает вам предварительно открыть порт в главном потоке.
Кстати, интересно, почему вам не подходит таймер?
-
Не понятно зачем функция
TReadTEM1.AOpenPort
А ошибка заключается в названии тега 'PV ' (два пробела) а не 'pv'
-
Малышев Олег
ошибка заключается в названии тега 'PV ' (два пробела) а не 'pv'
У клиента последняя версия библиотек, поэтому кол-во пробелов не важно.<!-- / message -->
-
прога должна отслеживать температуру в реальном времени с таймерами
силино подвисает главная форма
-
предлагаю такой подход
Можно порекомендовать следующую архитектуру: заведите флаги на каждое измеряемое значение, например, так: array[1..8] of boolean
Используйте таймер или таймеры только для того, что бы устанавливать флаги в true, это будет обозначать, что соответствующее значение пора считать. Такие таймеры не будут тормозить пользовательский интерфейс.
Используйте один вспомогательный поток, точнее нить (thread) для обмена с прибором через owen_io.dll. В нём откройте порт, затем читайте значения флагов по кругу в бесконечном цикле (выход из которого только при завершении программы). В случае обнаружения true сбрасывайте флаг в false и читайте соответствующую температуру.
Я надеюсь, вы понимаете, что правильная передача значений сложных типов между потоками требует их “обёртки” в mutex-ы или критические секции. Это, однако, не относится к простым типам, такие как числа и array […] of boolean (т.е. в случае температуры).
Всё это сильно упростит вам написание и оптимизацию программы, потому что вместо множества нитей/thread-ов у вас будет только одна вспомогательная нить.
Обмен по каждому отдельному порту всё равно идёт последовательно, так что открытие нескольких конкурирующих потоков, читающих каждый своё значение, может только ухудшить общую скорость.
-
Большое псасибо
ваш вариант реально работает