Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-98604
lasso
2003-10-21 16:14
2003.10.30
форма


3-98437
stud
2003-10-10 15:46
2003.10.30
гляньте, что тут не так?


7-98899
Марат
2003-08-20 14:01
2003.10.30
Обновление


3-98466
k_len
2003-10-10 06:55
2003.10.30
Одинаковые записи


3-98435
stud
2003-09-29 11:58
2003.10.30
вопрос по серверам





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