Главная страница
    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.01 c
11-98531
D.V.K
2003-02-11 12:02
2003.10.30
как подключить к Дельфи


1-98538
oens
2003-10-21 15:26
2003.10.30
создание EXE файла


8-98751
VID
2003-06-27 22:50
2003.10.30
TMediaPlayer буйствует!


1-98634
off
2003-10-17 14:37
2003.10.30
Вывод на печать?


1-98543
SoftAl
2003-10-20 12:45
2003.10.30
градиент в rxrichedit





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