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

Вниз

Многопоточность и COM   Найти похожие ветки 

 
Evloev Oleg   (2005-05-04 19:24) [0]

Hi All,

Вопрос такой.

Есть поток, в котором вызывается метод COM-сервера, который, в свою очередь, выполняется довольно медленно. Для контроля его работы на экране висит окно, отображающее текущее состояние дел. На этом окне есть кнопочка "Отменить", прерывающая работу сначала COM-сервера, а потом потока.
Вопрос. Как правильно остановить COM-сервер, чтобы он потом не вешал сам поток, в котором его запускали.
Код примерно такой.

В потоке, работающем с COM-объектом.

var Server:TComServer;

procedure DoingSome;
begin
 try
   Server.Doing; // вызов медленной процедуры
 except
  .. все плохо
 end;
end;

procedure KillServer;
begin
 FreeAndNil(Server);
end;


Факт в том что процедура KillServer вызывается во время работы Server.Doing, из другого потока. Все вроде проходит нормально, но потом этот поток, который работал с COM-сервером, вешает программу при вызове метода Terminate. Хотя в этот метод ничего не прописано. Если вместо Server.Doing написать например Sleep(4000), то Terminate проходит без проблем.

Ну вот, надеюсь внятно спросил. Пытался использовать критические секции для синхронизации процедур. Они действительно синхронизировались, то есть вторая вызывалась только после отработки первой. Однако конечный результат (Terminate) не изменился.


 
Набережных С. ©   (2005-05-04 22:00) [1]

Отключать объект из другого потока - не лучшая идея, мягко говоря. Под W2k and latter - CoCancelCall. Либо сервер должен поддерживать такую возможность. Например, метод принимает интерфейс обратного вызова и вызывает его метод периодически, по мере обработки запроса. Возвращаемый результат можно использовать для отмены.

PS: Надеюсь, а счет маршалинга ты в курсе.


 
Набережных С. ©   (2005-05-04 22:00) [2]

Отключать объект из другого потока - не лучшая идея, мягко говоря. Под W2k and latter - CoCancelCall. Либо сервер должен поддерживать такую возможность. Например, метод принимает интерфейс обратного вызова и вызывает его метод периодически, по мере обработки запроса. Возвращаемый результат можно использовать для отмены.

PS: Надеюсь, а счет маршалинга ты в курсе.


 
Evloev Oleg   (2005-05-05 11:09) [3]

Наверное более точно код приведу. Так как зависание происходит даже не доходя до метода FreeAndNil(Server).

Существует Thread, в котором находится объект Interpreter. В нем две функции:

// Сама медленная функция
function TInterpreter.Interpret(Script:widestring):boolean;
begin
 EnterCriticalSection(FLock);
 try
   try
     ComServer.Execute(Script);
   except
     on E:Exception do begin
       RaiseExceptionFmt("Ошибка обработки скрипта: %s",[E.Message]);
     end;
   end;
 finally
   LeaveCriticalSection(FLock);
 end;
end;

// Её останов
procedure TInterpreter.DeActivate;
begin
 EnterCriticalSection(FLock);
 try
   FreeAndNil(ComServer);
 finally
   LeaveCriticalSection(FLock);
 end;
end;


Первая функция вызывается в данном потоке, а вторая по событию нажатия клавиши, то есть из другого потока, как я понимаю. Чтобы их разграничить, я выставил критические секции.
Если вместо ComServer.Execute(Script) поставить любую другую локальную медленную функцию, то EnterCriticalSection(FLock) в методе DeActivate спокойно дождется ее выполнения и потом убьет сервер. Однако в текущем коде EnterCriticalSection(FLock) в DeActivate никогда не дождется своей очереди, даже если сервер закончил обрабатывать функцию. Все просто виснет насмерть.


 
Slym ©   (2005-05-06 05:08) [4]

Пока ComServer не будет поддерживать отмену выполнения или калбаки ничего у тебя не получится. FreeAndNil(ComServer) не выход, а ошибка



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

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

Наверх




Память: 0.46 MB
Время: 0.059 c
2-1142341927
kilop
2006-03-14 16:12
2006.03.26
Есть процедура приостановления работы программы, но ...


15-1141201191
McSimm
2006-03-01 11:19
2006.03.26
Funny UNIX Shell Commands


15-1141061124
grisme
2006-02-27 20:25
2006.03.26
Старая, избитая тема


1-1140344181
s&r
2006-02-19 13:16
2006.03.26
[?]Отправка символа RichEdit


15-1141716165
БарЛог
2006-03-07 10:22
2006.03.26
Возвращение прав после изъятия





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский