Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Вниз

Почему такое бывает   Найти похожие ветки 

 
r.o.o.t   (2007-11-02 11:48) [0]

Нород такая проблема просветите.
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 документов они виснут пока из клиента необратишся к интерфейсу сервера(любому) или невыгрузишь прогу....

КАК быть??


 
Сергей М. ©   (2007-11-06 11:29) [1]

Воспользоваться отладчиком.


 
r.o.o.t   (2007-11-06 17:04) [2]

пользовался и выяснил следующее что после события Open т.е. как состоится подключение к серверу весь COM в Windows останавливается
т.е. невозможно открыть Excel Word итд..


 
Сергей М. ©   (2007-11-06 17:30) [3]


> невозможно открыть Excel Word


Что значит "невозможно" ?


 
r.o.o.t   (2007-11-06 17:51) [4]

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

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


 
Сергей М. ©   (2007-11-07 08:48) [5]


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


Что ж ты молчишь как партизан на допросе про то, что ты работаешь с TSocketConnection в доп.потоке ?

CoInitialize(nil);
try
.. работа с СОМ/OLE-серверами ..
finally
 CoUninitialize;
end;


 
r.o.o.t   (2007-11-07 09:44) [6]

угу партизан
а почему происходит остановка COM этож как то неверно


 
r.o.o.t   (2007-11-07 09:48) [7]

в каком модуле обьявлен CoInitialize(nil);??


 
r.o.o.t   (2007-11-07 10:32) [8]

обработал этими процедурами вс участки кода где происходит обращение через TSocketConnection непомогло COM тормазит по прежденму
чего я не учел????


 
Slym ©   (2007-11-07 11:09) [9]

CoInitialize(nil);
try
 Connection:=TSocketConnection.Create
 try
  .. работа с СОМ/OLE-серверами ..
 finally
   Connection.Free;
 end;
finally
CoUninitialize;
end;


 
r.o.o.t   (2007-11-07 11:52) [10]

ТАК И ДЕЛАЮ ВСЕ COM тормазит всеравно


 
Сергей М. ©   (2007-11-07 12:26) [11]


> r.o.o.t   (07.11.07 11:52) [10]


А у меня не тормозит.
Что я не так делаю ?


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

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


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

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

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


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

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


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

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


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


> вызыват его


Кого "его" ?


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


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


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

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


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

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


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

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

У меня трех звенка через 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:35) [20]


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


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

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

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


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

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


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

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


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

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

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

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

пойдет??


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


> пойдет??


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


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


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


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

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


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


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


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


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

щаз....
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 16:02) [28]

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


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

вот
  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:13) [30]

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


 
sniknik ©   (2007-11-07 16:13) [31]

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

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

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

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


 
sniknik ©   (2007-11-07 16:15) [32]

> Procedure test.Out_proc1;
>   begin
>      form1.Button1.Caption:="вот";
>      form1.Update;
>    end;
вот еще к первому замечанию.


 
Сергей М. ©   (2007-11-07 16:18) [33]


> он с COM и не работает


Почем я знаю, работает он с СОМ или не работает ?)
Бросил огрызок кода и сидит ждет у моря погоды)

Во-первых, неизвестно где находится и что делает его апп-сервер, может он на той же машине и в нем черт-те что и сбоку бантик ..

Во-вторых, неизвестно обрабатываются ли колбэки и как обрабатываются ...


 
r.o.o.t   (2007-11-07 16:23) [34]

1. в данном куске кода необрабатываются CallBack но он необходим
2. сервер находится на удаленной машине функционирует нормально...
3. MIDAS  использует COM
4. SIGNAL.Strings[0]; итак глобальная переменная но доступ к ней из одного птока вызов происходит через
  Procedure test.Input_proc1(s:string);
 begin
   SIGNAL.Add(s);
 end;
где s =1 или 2 по данным значиниям вызываются proc1 proc2


Вопрос почему виснет весь COM в системе


 
Сергей М. ©   (2007-11-07 16:35) [35]


> почему виснет весь COM в системе


Потому что у тебя совершенно бестолковый цикл в методе Execute, беспардонно отжирающий у планировщика уйму квантов времени, ничего полезного при этом не делая.


> SIGNAL.Strings[0]; итак глобальная переменна


Какого же лешего ты не синхронизируешь мультипоточные обращения к этому ресурсу ?


 
r.o.o.t   (2007-11-07 16:40) [36]

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


 
r.o.o.t   (2007-11-07 16:41) [37]

в частности виснет COM


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


> почему все прекрасно работает только в момент вызова процедур
> к MIDAS


Потому что при ожидании ответа апп-сервера на запрос транспортный поток, созданный компонентом. переходит в kernel-time.

Исходники компонента Борланд предоставил для тебя, а не для Пушкина)


 
r.o.o.t   (2007-11-07 16:47) [39]

тем самы освобаждая планировщик....

ок дай пару реализаций  вызова процедур из потока


 
Сергей М. ©   (2007-11-07 16:47) [40]


> в момент вызова процедур к MIDAS


К тому же в приведенном тобой шматке кода нет ни намека на такие вызовы.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.039 c
15-1195042164
de.
2007-11-14 15:09
2007.12.16
RS-422/485


2-1195297585
Kolan
2007-11-17 14:06
2007.12.16
Как разобраться как работает механизм ShortCut у TAction?


15-1195547095
Slider007
2007-11-20 11:24
2007.12.16
С днем рождения ! 20 ноября 2007 вторник


4-1179914782
Ангела
2007-05-23 14:06
2007.12.16
Как отследить, какие функции вызывает программа из Dll ?


5-1164191017
Master_
2006-11-22 13:23
2007.12.16
MiTeC System Information Component - где взять!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский