![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему такое бывает
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 документов они виснут пока из клиента необратишся к интерфейсу сервера(любому) или невыгрузишь прогу....
КАК быть??
Сергей М. (2007-11-07 16:58:00) [21]
> function Connect:integer;external 'Project2.dll' name
> 'Connect';
> function Connect1:integer;external 'Project2.dll' name
> 'Connect1';
>
А это чего такое ?
r.o.o.t (2007-11-07 16:57:00) [22]щас даю код
sniknik (2007-11-07 16:57:00) [23]> всеравно виснет
и это все что ты сделал? из того что я написал.
p.s. вот это сразу поменяло смысл нашего общения.
Сергей М. (2007-11-07 16:56:00) [24]
> r.o.o.t (07.11.07 16:53) [47]
Убери колбэки, убери ВСЕ лишнее,т приведи результ.код, а там посмотрим ...
r.o.o.t (2007-11-07 16:53:00) [25]sniknik © (07.11.07 16:48) [41]
> почему виснет весь COM в системе
procedure test.Execute;
begin
Excec_proc1;
while not Terrminated do
sleep(30);
Excec_proc2;
end;
всеравно виснет
Сергей М. © (07.11.07 16:49) [42] вот код который незагружает планировщик проблема остается почему??
sniknik (2007-11-07 16:53:00) [26]> но суть остается преждней....
суть меняется с каждым измененным/добавленным фактом...
сравни.
комп ни с того ни сего перестал работать. почему?
уронил на комп гирю в 24кг и он перестал работать. почему?
sniknik (2007-11-07 16:51:00) [27]и еще кстати проверка, без которой все выше бессмысленно, сделать Excec_proc1; Excec_proc2; для основного потока, добиться работы при их вызове. (и форму тогда не надо создавать, главную подставить)
Сергей М. (2007-11-07 16:51:00) [28]
> я просто нестал описывать
Ну раз ты в них непокобелимо уверен, продолжай париться)
r.o.o.t (2007-11-07 16:49:00) [29]да я просто нестал описывать их но суть остается преждней....
Сергей М. (2007-11-07 16:49:00) [30]
> дай пару реализаций вызова процедур из потока
Что значит "дай" ?! Да еще и "пару" ?)
Вызов процедуры - он и в Африке вызов процедуры. Иначе как не из потока процедуру вызвать невозможно)
sniknik (2007-11-07 16:48:00) [31]> почему виснет весь COM в системе
сделай пример (далее смутно, обьяснить трудно (давно с мидас не работал), просто проверь, все вместе и если заработает поодиночке)
1 не трогай SIGNAL извне, лучше вообще убери
2 SrvConnection сделай переменной класса, лучше приватной чтобы доступа извне не было
3 TSocketConnection.Create(nil); вместо nil подставь форму, форму сделай тут же в потоке (локальная переменная)
4 назначь парентом у SrvConnection туже созданную форму.
5 закоментарь SrvConnection.SupportCallbacks:=true;
6 вставь в Execute "пустышку" типа
procedure test.Execute;
begin
Excec_proc1;
while not Terrminated do
sleep(30);
Excec_proc2;
end;
(CoInitialize/... в принципе можно убрать)
так не виснет?
Сергей М. (2007-11-07 16:47:00) [32]
> в момент вызова процедур к MIDAS
К тому же в приведенном тобой шматке кода нет ни намека на такие вызовы.
r.o.o.t (2007-11-07 16:47:00) [33]тем самы освобаждая планировщик....
ок дай пару реализаций вызова процедур из потока
Сергей М. (2007-11-07 16:44:00) [34]
> почему все прекрасно работает только в момент вызова процедур
> к MIDAS
Потому что при ожидании ответа апп-сервера на запрос транспортный поток, созданный компонентом. переходит в kernel-time.
Исходники компонента Борланд предоставил для тебя, а не для Пушкина)
r.o.o.t (2007-11-07 16:41:00) [35]в частности виснет COM
r.o.o.t (2007-11-07 16:40:00) [36]т.е. ну допустим мой код Execute перегружает планировщих и непозволяет COM работаь правельно с атомами тогда возникает вопрос почему все прекрасно работает только в момент вызова процедур к MIDAS а в моменты ожидания все виснет даже если обрабатывается другие процедуры
Сергей М. (2007-11-07 16:35:00) [37]
> почему виснет весь COM в системе
Потому что у тебя совершенно бестолковый цикл в методе Execute, беспардонно отжирающий у планировщика уйму квантов времени, ничего полезного при этом не делая.
> SIGNAL.Strings[0]; итак глобальная переменна
Какого же лешего ты не синхронизируешь мультипоточные обращения к этому ресурсу ?
r.o.o.t (2007-11-07 16:23:00) [38]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:18:00) [39]
> он с COM и не работает
Почем я знаю, работает он с СОМ или не работает ?)
Бросил огрызок кода и сидит ждет у моря погоды)
Во-первых, неизвестно где находится и что делает его апп-сервер, может он на той же машине и в нем черт-те что и сбоку бантик ..
Во-вторых, неизвестно обрабатываются ли колбэки и как обрабатываются ...
sniknik (2007-11-07 16:15:00) [40]> Procedure test.Out_proc1;
> begin
> form1.Button1.Caption:='вот';
> form1.Update;
> end;
вот еще к первому замечанию.