Форум: "Начинающим";
Текущий архив: 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.046 c