Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 09:28   #1
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
Вопрос Компонент OPCClient в потоке

Добрый день. Помогите разобраться.
Делаю поток . в нем создаю OPCClient, затем создаю окно и запускаю цикл обработки сообщений. Но ни от сервера ни от кого либо другого в цикл сообщения не поступают. В чем может быть проблема? И может кто кинет ссылочку как между собой общаются COM объекты? по tcp или еще как то?
Вот код который запускаю после коннекта клиента к серверу
Код:
procedure COPCClient.Run;
var
  Msg: TMsg;
begin
  FHandle := AllocateHwnd(WndProc);

  while GetMessage(Msg,0,0,0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  if FHandle <> 0 then DeallocateHWnd(FHandle);
end;
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 16.03.2011, 09:31   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
В чем может быть проблема?
В том что никто твоему потоку никакие сообщения не посылает.

Цитата:
как между собой общаются COM объекты?
По LPC и RPC.
mss вне форума Ответить с цитированием
Старый 16.03.2011, 09:31   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вообще, у компонента OPCClient есть свой обработчик сообщений, загляните в генофонд/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.03.2011, 09:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как между собой общаются COM объекты?
Если в потоке, то стоит перез работой с СОМ выполнить CoInitialize(0) а после отработки CoUnInitialize;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.03.2011, 10:13   #5
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

Делаю так
Код:
procedure COPCClient.Execute;
begin
  CoInitialize(nil);
  FOPCClient.Connect;
  Run;
  CoUninitialize;
end;
Все равно не проходит.
В общем нужно ка кто сделать так чтобы сообщения от OPC сервера поступали в поток. Как то же он работает, когда работает в основном потоке программы. Помогите разобраться или наставить на путь истинный.
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 16.03.2011, 10:28   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
FOPCClient.Connect;
Кто такой FOPCClient ?
Где создается и инициализируется ?
Где и как назначаются обработчики его событий, если таковые есть ?
mss вне форума Ответить с цитированием
Старый 16.03.2011, 10:34   #7
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

Код:
unit OPCClient;

interface

uses
  Classes, prOpcClient, Messages, Windows, ActiveX;

type
  COPCClient = class(TThread)
  private
    FOPCClient: TOpcSimpleClient;
    FHandle: HWND;
  protected
    procedure Execute; override;
    procedure WndProc(var Msg: TMessage); virtual;
    procedure Run;
  public
    constructor Create;
  end;

implementation

constructor COPCClient.Create;
var
  zOPCGroup: TOpcGroup;
begin
  inherited Create(true);
  FOPCClient := TOpcSimpleClient.Create(nil);
  zOPCGroup := FOPCClient.Groups.Add;
  zOPCGroup.UpdateRate := 1000;
  zOPCGroup.Items.Add('FormHeight');
  FOPCClient.ProgID := 'prDemo5.TDemo5.1'
end;

procedure COPCClient.Execute;
begin
  CoInitializeEx (nil);
  FOPCClient.Connect;
  Run;
  CoUninitialize;
end;

procedure COPCClient.Run;
var
  Msg: TMsg;
begin
  FHandle := AllocateHwnd(WndProc);
  while GetMessage(Msg,0,0,0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  if FHandle <> 0 then DeallocateHWnd(FHandle);
end;

procedure COPCClient.WndProc(var Msg: TMessage);
begin

end;

end.
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 16.03.2011, 11:07   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А обработчик события OnDataChange кто за тебя будет назначать и обрабатывать, Пушкин ?
mss вне форума Ответить с цитированием
Старый 16.03.2011, 11:14   #9
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

сделал так
Код:
constructor COPCClient.Create;
var
  zOPCGroup: TOpcGroup;
begin
  inherited Create(true);
  FOPCClient := TOpcSimpleClient.Create(nil);
  zOPCGroup := FOPCClient.Groups.Add;
  zOPCGroup.OnDataChange := DataChange;//!!!
  zOPCGroup.UpdateRate := 1000;
  zOPCGroup.Items.Add('FormHeight');
  FOPCClient.ProgID := 'prDemo5.TDemo5.1'
end;

procedure COPCClient.DataChange(Sender: TOpcGroup; ItemIndex: Integer;
  const NewValue: Variant; NewQuality: Word; NewTimestamp: TDateTime);
begin
//
end;
но все равно не вызывается DataChange. он встает на GetMessage в петле сообщений и все. Извиняюсь за наглость. если у вас работает, вы бы не смогли привести пример?

Причем connect срабатывает и на сервере я вижу группу и параметр, но вот событие OnDataChange не наступает!
интенсивно гуглю прежде чем задать вопрос

Последний раз редактировалось Баламут; 16.03.2011 в 11:28.
Gregor вне форума Ответить с цитированием
Старый 16.03.2011, 11:38   #10
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

Спасибо разобрался. дело было не в потоке. забыл выставить группе свойство Active := true.
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка в отдельном потоке Crystallon Общие вопросы Delphi 4 05.10.2010 15:15
Таймер в потоке alexprey Общие вопросы Delphi 14 11.08.2010 23:14
работа с TStringList в потоке OPF_Nik Помощь студентам 6 01.02.2010 15:15
Ошибка в потоке User>lia Общие вопросы Delphi 5 20.01.2009 18:55
TClientSocket в потоке BlackOmen Работа с сетью в Delphi 8 27.04.2008 22:19