Thread и std::exception в управляемом коде переполнение стек
От: dmitriy2004  
Дата: 02.04.04 16:58
Оценка:
Подскажите, пожалуйста, как обойти проблему или что необходимо сделать, что бы она не возникала.
Проблема заключается в следующем: в управляемом коде на C++ под .NET создается поток (thread), в данном потоке в цикле выполняется кусок кода для обработчик исключения std::exception, после выполенения цикла некоторого количества раз гененрируется исключение .NET, что переполнился стек. В debug-е было замечено, что в данном цикле компилятор добавил вызыв еще одной функции __CxxQueryStackSize.
Данная проблема не возникает, если функцию потока поместить в неуправляемый код, т.е. поместить ее между дерективами:
#pragma unmanaged

// текст функции потока

#pragma managed

Код выглядит так:

#include <windows.h>
#include <exception>

namespace testthread
{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Threading;

public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}

static void ThreadProc()
{
// ОШИБКА
// В данном цикле и происходит переполнение стека
//
while ( !m_bIsStop ) {
try {
}
catch ( std::exception & ex ) {
}

Sleep( 0 );
}
}

protected:
// выкинута функция Dispose
// ..........
//

private: System::Windows::Forms::Button * button1;
private: System::Windows::Forms::Button * button2;
private: Thread * oThread;
private: static bool m_bIsStop;

private:
System::ComponentModel::Container * components;

// выкинута инициализация форы
// ..........
//
private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
m_bIsStop = false;

// Create the thread, passing a ThreadStart delegate that
// represents the ThreadExample::ThreadProc method. For a
// delegate representing a static method, no object is
// required.
oThread = new Thread(new ThreadStart(0, &Form1::ThreadProc));

// Start the thread.
oThread->Start();
}

private: System::Void button2_Click(System::Object * sender, System::EventArgs * e)
{
m_bIsStop = true;
}

};
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.