C++/CLI throw в бэкграунд потоке валит программу
От: jyuyjiyuijyu  
Дата: 14.07.13 22:32
Оценка: :)
Всем привет


значит если написать такой код в главном потоке

throw "bad"

то появляется окно с каллстеком все как полагается
сообщающее System.Runtime.InteropServices.SEHException

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

а вот если в самом бэкграунд потоке бросить исключение throw "bad"
то сразу же появляется

Microsoft Visual C++ Runtime Library

Runtime Error!

и просто ничего не сообщая прибивает программу

у меня в программе подписаны обработчики на необработанные исключения

AppDomain::CurrentDomain->UnhandledException += gcnew 
        UnhandledExceptionEventHandler(gcnew CatchException, &CatchException::UnhandledException);
    
    Application::ThreadException += gcnew 
        ThreadExceptionEventHandler(gcnew CatchException, &CatchException::ThreadException);


так вот в этом случае прога просто прибивается и никакие обработчики не вызываются...

я компилирую в режиме /clr а вот если переключить в режим /clr:pure то и для бэкгрунд потоков
начинает показываться полный каллстек до процедуры вызвавшей throw "bad"...

почему такое происходит ? почему один и тот де код throw "bad" в основном потоке преобразуется в исключение
System.Runtime.InteropServices.SEHException и показывается полный каллстек а в бэкграунд потоках этот код вызывает

Microsoft Visual C++ Runtime Library

Runtime Error!


и без объяснений прибивает программу...

и почему при включение /clr:pure исключения начинают преобразовываться в System.Runtime.InteropServices.SEHException
и показывать полный каллстек и для бэкграунд потоков ?

поток я создаю так... тоесть это обычный менеджед поток...

void crash_thread()
             {
                 throw "bad";
                 
             }

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

                 //throw "bad";

                 Thread^ t = gcnew Thread(gcnew ThreadStart(this, &Form1::crash_thread));
                 t->Start();


так вот выполнение throw "bad" в потоке валит программу в

Microsoft Visual C++ Runtime Library

Runtime Error!


а вот если раскомментить //throw "bad" в хендлере кнопки то это искллючение преобразуется в
System.Runtime.InteropServices.SEHException и показывается окошко с каллстеком до самого хендлера кнопки...

причем если включить /clr:pure то и для бэкгрунд потоков начинает нормально работать...

спасибо
Re: C++/CLI throw в бэкграунд потоке валит программу
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.07.13 06:10
Оценка: +1
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Всем привет



J>значит если написать такой код в главном потоке


J>throw "bad"


http://msdn.microsoft.com/en-us/library/vstudio/hh875008.aspx
http://msdn.microsoft.com/en-us/library/85344whh.aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.