Подскажите, пожалуйста, как обойти проблему или что необходимо сделать, что бы она не возникала.
Проблема заключается в следующем: в управляемом коде на 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
// ..........
//
// 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));