Показано с 1 по 7 из 7

Тема: Дельфи и Owen OnLine

  1. #1

    Unhappy Дельфи и 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. Помогите. Спасибо.

  2. #2

    По умолчанию

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

  3. #3

    По умолчанию

    Не понятно зачем функция
    TReadTEM1.AOpenPort

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

  4. #4

    По умолчанию

    Малышев Олег
    ошибка заключается в названии тега 'PV ' (два пробела) а не 'pv'
    У клиента последняя версия библиотек, поэтому кол-во пробелов не важно.<!-- / message -->

  5. #5

    По умолчанию

    прога должна отслеживать температуру в реальном времени с таймерами
    силино подвисает главная форма

  6. #6

    Arrow предлагаю такой подход

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

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

  7. #7

    По умолчанию

    Большое псасибо
    ваш вариант реально работает

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •