Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.30;
Скачать: CL | DM;

Вниз

Обработка исключений в разных потоках   Найти похожие ветки 

 
jack128 ©   (2003-10-20 14:41) [0]

Добрый день
Скажите возможно ли в блоке
except
end;
не уничтожать объект исключение, но и не "подымать" его..
Смысл в том, что исключение происходит в одном потоке, в необходимо переправить объект исключение в другой поток например так
try
SameFuncion(); // здесь возникает исключение
except
on E : Exception do
PostThreadMessage(MainThreadId, MM_ERROR, Cardinal(E), 0);
end;// тут, как я понимаю, происходит уничтожение объекта E, соответсвенно с основном потоке возможно AV..


 
Игорь Шевченко ©   (2003-10-20 14:50) [1]

Нельзя


 
Ломброзо ©   (2003-10-20 14:53) [2]

Создавать копию исключения и передавать указатель на нее в другой поток?


 
Игорь Шевченко ©   (2003-10-20 14:56) [3]

Рихтера читать


 
Ломброзо ©   (2003-10-20 15:02) [4]

Читали-с, лежит перед носом весь в кругах от чашек с кофе.
Для чего нужно передача исключения в другой поток - представить сложно - кроме как для получения информации об исключении.
>jack128 © (20.10.03 14:41)
Так для чего же?


 
jack128 ©   (2003-10-20 15:10) [5]


> кроме как для получения информации об исключении.

Именно для этого и нужна..


 
Переяслов Григорий ©   (2003-10-20 15:34) [6]

При исключении, в секции except end вызывай Synchronize, в котором передавай сообщение об исключении основному потоку или посылай ему сообщение через Dispath или SendMessage


 
Ломброзо ©   (2003-10-20 15:44) [7]

Понятно. Я делал что-то подобное:

При возникновении исключения (в блоке except) создавай свой экземпляр класса Exception (или производный от него) и копируй в него "пойманное" исключение. Полученный указатель сохраняй в объекте-контейнере (производный от TList или TStack), который виден из обоих потоков. Я бы сделал метод Push(AItem: EMyException) и какое-нибудь событие, навроде (псевдокод):

TExceptionStackEvent = procedure(E: EMyException) of object;

TExceptionStack = class(TStack)
FOnException: TExceptionStackEvent;
end;

procedure TExceptionStack.Push(AItem: EMyException);
begin
inherited Push(pointer(AItem));
if Assigned(FOnException) then FOnException(AItem);
end;

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

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


 
jack128 ©   (2003-10-20 15:55) [8]


> При исключении, в секции except end вызывай Synchronize,
> в котором передавай сообщение об исключении основному потоку
> или посылай ему сообщение через Dispath или SendMessage
некатит.. При этом будет стопориться допонит. поток


> Ломброзо © (20.10.03 15:44) [7]
Угу, идея понятна, спасибо..


 
Ломброзо ©   (2003-10-20 15:59) [9]

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


 
Digitman ©   (2003-10-20 17:19) [10]


> jack128


посмотри как это делается в модуле SConnect,
метод
procedure TTransportThread.Execute;

об исключении в трансп.код.потоке извещается осн.код.поток приложения


 
jack128 ©   (2003-10-20 18:02) [11]


> Digitman © (20.10.03 17:19) [10]

Шикарно!!!
Огромное спасибо - это как раз самое то!!!

нужно только разобраться откуда берется RaiseList (я в асме никакой :-() и все будет ОК (хотя думаю и так сойдет)



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

Текущий архив: 2003.10.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
3-98446
Марат
2003-10-10 14:53
2003.10.30
SQL result


1-98613
COSINUS
2003-10-17 18:19
2003.10.30
Прикручивание ехе-шника к электронному ключу


3-98465
korvin
2003-10-09 13:30
2003.10.30
Фокус внутри dxDBGrid


4-98922
SH
2003-08-26 17:32
2003.10.30
Как определить, что окно свёрнуто?


4-98925
jonni
2003-08-25 16:09
2003.10.30
Подвинуть окна