Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизОбработка исключений в разных потоках Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c