Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему такое бывает


Страницы:   1 2 3 4

r.o.o.t ©   (2007-11-02 11:48:00) 

Нород такая проблема просветите.
SrvConnection:= TSocketConnection.Create(nil);
  SrvConnection.Address:=Exec_InitSrvConnection_IP_Adrr;
  SrvConnection.Port:=Exec_InitSrvConnection_IP_Port;
  SrvConnection.ServerName:='BrsServer.BrsServer_Controller';
  SrvConnection.ServerGUID:='{AC69FABC-4752-4CF2-99E9-85CE86F99172}';
  SrvConnection.SupportCallbacks:=true;
  SrvConnection.LoginPrompt:=false;
  SrvConnection.Open;
Вот кусок кода создающий TSocketConnection который создается в потоке и конектится на MIDAS сервер трабл заключается в том что весь COM тормазится в системе WinXP  т.е. при попытки открытия *.doc *.xls документов они виснут пока из клиента необратишся к интерфейсу сервера(любому) или невыгрузишь прогу....

КАК быть??


sniknik   (2007-11-07 16:13:00) [41]

> SIGNAL.Strings[0];
вот это не правильно, если ты конечно не ограничиваешь доступ нему только этим потоком (зачем тогда сделал глобальной переменной?), и если ограничиваешь то откуда там утебя тогда появляются обрабатываемые значения?  

> SrvConnection.SupportCallbacks:=true;
а куда, придет сообщение обратного вызова? ни форм, ни выборки/обработки сообщений у тебя в потоке нет.

и вообще какой смысл запихивать это в поток? тут же разовые подключения/обработка создание сообщения в основном для потока займет столько же времени (может чуть меньше) чем их обработка.  

> Ну и где в этом коде выполнение рекомендаций из [5], [9] ?
а тут он с COM и не работает, он посылает сообщение серверу мидас, вот он работает. т.что это не то.


Сергей М.   (2007-11-07 16:13:00) [42]

А зачем тебе колбэки ?


r.o.o.t   (2007-11-07 16:06:00) [43]

вот
  Procedure test.Excec_proc1;
   begin
   CoInitialize(nil)входим из STA
     SrvConnection:=TSocketConnection.Create(nil);
     SrvConnection.Address:='80.69.155.66';
     SrvConnection.Port:=211;
     SrvConnection.ServerName:='BrsServer.BrsServer_Controller';
     SrvConnection.ServerGUID:='{AC69FABC-4752-4CF2-99E9-85CE86F99172}';
     SrvConnection.SupportCallbacks:=true;
     SrvConnection.LoginPrompt:=false;
     SrvConnection.Open;
   CoUninitialize;выходим из STA
     Synchronize(Out_proc1);
   end;

Ничего недает т.е код приведенные выше работает так же как и этот и такая релизация тоже ничего недает

  Procedure test.Excec_proc1;
   begin
   CoInitialize(nil)  входим в STA
     SrvConnection:=TSocketConnection.Create(nil);
     SrvConnection.Address:='80.69.155.66';
     SrvConnection.Port:=211;
     SrvConnection.ServerName:='BrsServer.BrsServer_Controller';
     SrvConnection.ServerGUID:='{AC69FABC-4752-4CF2-99E9-85CE86F99172}';
     SrvConnection.SupportCallbacks:=true;
     SrvConnection.LoginPrompt:=false;
     SrvConnection.Open;
     Synchronize(Out_proc1);
   end;

  Procedure test.Excec_proc2;
   begin
      SrvConnection.Close;
     CoUninitialize; выходим из STA
   end;


Сергей М.   (2007-11-07 16:02:00) [44]

Ну и где в этом коде выполнение рекомендаций из [5], [9] ?


r.o.o.t   (2007-11-07 15:59:00) [45]

щаз....
unit Unit2;

interface

uses
 Classes,SysUtils,SConnect,ActiveX,Windows;
 Function Connect:integer;stdcall;
 Function Connect1:integer;stdcall;

type
 Test = class(TThread)
 private
   { Private declarations }
 protected
 public
   procedure Execute; override;
   Procedure Input_proc1(s:string);
   Procedure Excec_proc1;
   Procedure Excec_proc2;
   Procedure Out_proc1;
 end;

 Var
   SIGNAL:TStringList;
   SrvConnection: TSocketConnection;
   function Connect:integer;external 'Project2.dll' name 'Connect';
   function Connect1:integer;external 'Project2.dll' name 'Connect1';

implementation

uses Unit1;
  Procedure test.Input_proc1(s:string);
  begin
    SIGNAL.Add(s);
  end;

   Procedure test.Excec_proc1;
   begin
     SrvConnection:=TSocketConnection.Create(nil);
     SrvConnection.Address:='10.10.10.1';
     SrvConnection.Port:=211;
     SrvConnection.ServerName:='Server.Server_Controller';
     SrvConnection.ServerGUID:='{A69FABC-4752-4CF2-99E9-85CE86F99172}';
     SrvConnection.SupportCallbacks:=true;
     SrvConnection.LoginPrompt:=false;
     SrvConnection.Open;
     Synchronize(Out_proc1);
   end;

   Procedure test.Excec_proc2;
   begin
      SrvConnection.Close;
   end;

   Procedure test.Out_proc1;
   begin
     form1.Button1.Caption:='вот';
     form1.Update;
   end;

procedure test.Execute;
var
Signal_:string;
begin
 while True do
 begin
  sleep(30);
  if SIGNAL=nil then
  SIGNAL:=TStringList.Create;
   if SIGNAL<>nil then
    if SIGNAL.Count>0 then
    begin
      Signal_:=SIGNAL.Strings[0];
      SIGNAL.Delete(0);
    end;
   if SIGNAL_='1' then Excec_proc1;
   if SIGNAL_='2' then Excec_proc2;
   Signal_:='';
  end;
 end;

end.


Сергей М.   (2007-11-07 15:58:00) [46]


> читал про STA и MTA пробовал


Ты русский язык понимаешь или нет ?
Тебе по-русски говорят - приводи код этих "процедур" и код их вызова)


r.o.o.t   (2007-11-07 15:56:00) [47]

читал про STA и MTA пробовал
все остается так же.... COM торамазит и невозможно работа других програм с ним... работа воможна лишь тогда когда в потоке происходит обращение к методу RPC сервера  но это очень малый промежуток времени...


Сергей М.   (2007-11-07 15:56:00) [48]


> пойдет??


Нет, не пойдет.


> есть процедуры инициализации потока и процедуры остановки
> потока


Вот и показывай, что это за процедуры такие - где, как объявлены, где и в каком потоке вызываются...


r.o.o.t   (2007-11-07 15:52:00) [49]

епрст
Кого "его" ?

епрст вызываются методы....

по поводу зверя::: есть процедуры инициализации потока и процедуры остановки потока в которых описаны способы подключения к серверу и отключения вт и все

пойдет??


Сергей М.   (2007-11-07 15:46:00) [50]

Вот пока вразумительноне ответишь на [16], воз будет все там же)


r.o.o.t   (2007-11-07 15:41:00) [51]

я необращаюсь к экселю
я говорю вообще о том что другие программы использующие COM перестают работать в системе  пока я незавершу свое приложение либо работают в только в моменты вызова методов сервера в моем приложении...


Сергей М.   (2007-11-07 15:35:00) [52]


> блин формулирую внов


Не блинкай ! Разблинкался тут, понимаешь)..

За каким вообще лешим ты обращаешься к Ёхелю в доп.потоке ?

С TSocketConnection это еще как-то оправдано..


r.o.o.t   (2007-11-07 15:22:00) [53]

блин формулирую внов!!!

У меня трех звенка через TSocketConnection если разместить компонент на форме или DataModul при плохой свзяи интерфейс пользователя тормазит на моменты запрос ответ.. дале чтобы от этого избавится все вызовы процедур сервера RPC я вынес в поток все заработало и интерфейс перестал тормазить но вылез один баг: Вся COM автоматизация где запущен клиент тормазит и работает только в моменты вызова процедур удаленного сервера тормаза проявляются в том что невозможно использовать COM или OLE т.е. создавать контейнеры и сервера по какой причине непойму но думаю изза блокировк т.к. релизованна много поточная модель....
использование типа
CoInitialize(nil);
try
.. работа с СОМ/OLE-серверами ..
finally
CoUninitialize;
end;

результата недает COM продолжает тормазить.....

если процедуры обращения к серверу пустить через Synchronize то мы избавляемся от тормазов в COM но приобритаем тормаза в интерфейсе программы...

так вот как мне организовать работу к с удаленному серверу RPC в отдельном потоке через TSocketConnection
идет в сторону
CoInitializeEx (NIL, COINIT_MULTITHREADED);


Сергей М.   (2007-11-07 15:11:00) [54]

Как запряг, так и поехал)
Как сформулировал задачу-проблему, так и работать будет.


r.o.o.t   (2007-11-07 15:09:00) [55]

короче наработает


Сергей М.   (2007-11-07 13:09:00) [56]


> вызыват его


Кого "его" ?


> в процедуре подключения и отключать в процедуре отключения
> потока


Это еще что за зверь ?)


r.o.o.t   (2007-11-07 13:07:00) [57]

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


r.o.o.t   (2007-11-07 13:05:00) [58]

разобралсся достаточно вызыват его в процедуре подключения и отключать в процедуре отключения потока
тем самым свой процесс перевожу STA и все работает
вроде щас тестировать буду


Сергей М.   (2007-11-07 12:56:00) [59]

Объясни, за каким лешим ты вынес работу с компонентом в доп.поток, в то время как при разрешенных колбэках транспорт и диспетчеризация внутри компонента и так уже выполняется в доп.потоке ?

И в каком месте и при каких условиях ты обращаешься к СОМ-серверу ?


r.o.o.t   (2007-11-07 12:52:00) [60]

ну ты создаешь подключение обращаешся к методу сервера и отключаешся конечно тормазить небудет даже если уберешь CoInitialize(nil) из кода
а проблема в том что тут подключения нужно из потока деражать до завершения ПО тк сервер использует обратный вызов на клиенте и модель пришел выполнил ушел тут я думаю непроканает...
Может я ошибаюсь поясни....


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо