PDA

Просмотр полной версии : Дельфи и Owen OnLine



Vladimir
13.04.2007, 17:08
Привет!

У нас проблема с подключением прибора 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. Помогите. Спасибо.

Michael Shestero
13.04.2007, 20:34
Не понятно что мешает вам предварительно открыть порт в главном потоке.
Кстати, интересно, почему вам не подходит таймер?

Малышев Олег
16.04.2007, 09:33
Не понятно зачем функция
TReadTEM1.AOpenPort

А ошибка заключается в названии тега 'PV ' (два пробела) а не 'pv'

Мощицкий Павел
16.04.2007, 13:22
Малышев Олег (http://owen.ru/forum/member.php?u=16)
ошибка заключается в названии тега 'PV ' (два пробела) а не 'pv'
У клиента последняя версия библиотек, поэтому кол-во пробелов не важно.<!-- / message -->

Vladimir
17.04.2007, 10:01
прога должна отслеживать температуру в реальном времени с таймерами
силино подвисает главная форма

Michael Shestero
17.04.2007, 19:22
Можно порекомендовать следующую архитектуру: заведите флаги на каждое измеряемое значение, например, так: array[1..8] of boolean
Используйте таймер или таймеры только для того, что бы устанавливать флаги в true, это будет обозначать, что соответствующее значение пора считать. Такие таймеры не будут тормозить пользовательский интерфейс.
Используйте один вспомогательный поток, точнее нить (thread) для обмена с прибором через owen_io.dll. В нём откройте порт, затем читайте значения флагов по кругу в бесконечном цикле (выход из которого только при завершении программы). В случае обнаружения true сбрасывайте флаг в false и читайте соответствующую температуру.
Я надеюсь, вы понимаете, что правильная передача значений сложных типов между потоками требует их “обёртки” в mutex-ы или критические секции. Это, однако, не относится к простым типам, такие как числа и array […] of boolean (т.е. в случае температуры).

Всё это сильно упростит вам написание и оптимизацию программы, потому что вместо множества нитей/thread-ов у вас будет только одна вспомогательная нить.
Обмен по каждому отдельному порту всё равно идёт последовательно, так что открытие нескольких конкурирующих потоков, читающих каждый своё значение, может только ухудшить общую скорость.

Vladimir
19.04.2007, 14:28
Большое псасибо
ваш вариант реально работает