LoginSignup
asa777
@asa777

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

スタックオーバーフローの回避

解決したいこと

スタックオーバーフローを防ぎたいです。
C++/CLIで画面遷移を繰り返すと特定の回数繰り返したところで、
スタックオーバーフローが起きて停止してしまいます。
解決方法を教えて下さい。
またはスタックがどれだけ溜まるのか、溜まったのかを知りたいです。

該当するソースコード

	private: Bitmap^ mat2bmp(cv::Mat img)
	{
		const int alignedCols = static_cast<int>(cv::alignSize(img.cols, 4));
		cv::Mat alignedMat = cv::Mat(img.rows, alignedCols, img.type());

		mSrc = cv::Mat(alignedMat, cv::Rect(0, 0, img.cols, img.rows));
		img.copyTo(mSrc);

		Bitmap^ bmp = gcnew Bitmap(mSrc.cols, mSrc.rows,
			static_cast<int>(mSrc.step),
			System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(mSrc.ptr()));
		return bmp;
	}
	 private: System::Void MyForm_Activated(System::Object^  sender, System::EventArgs^  e) {
		 button2->Enabled = false; 
		 mPlayFlag1 = true;
		 Thread ^threadF = gcnew Thread(gcnew ThreadStart(this, &MyForm::threadFuncF));  // スレッドを用意
		 threadF->Start();
		 textBox2->Text = RQEST_OFF.ToString();   
	 }
		 //スレッドF st
	 public: System::Void threadFuncF() {
		//デリゲート5実行
		BeginInvoke(
		gcnew sampleDelegate5(this, &MyForm::execDele5));    //sampleDelegate5のインボーク開始
		cv::waitKey();
	 }
			 // デリゲート5
	 public: delegate System::Void sampleDelegate5();   //デリゲートの関数をsampleDelegate5とする
	 public: System::Void execDele5() //try            //
	 {
		 int a = 0;
		 while (mPlayFlag1) {
			 textBox1->Text = QUANSHW_VAL.ToString();	                    
			 color_r3 = cv::Mat(color_r2, cv::Rect(225, 32, 454, 454 ));	  //領域切出し
			 rotate(color_r3, color_r4, cv::ROTATE_90_COUNTERCLOCKWISE);
			 resize(color_r4, color_r5, cv::Size(), 1.5, 1.5);            //カラー画像をリサイズ  元(896,504)1.4(1254,706)
			 pictureBox1->Image = mat2bmp(color_r5);                      //リサイズした画像を表示
			 Sleep(100);
			 cv::waitKey();
		 }
		 return ;
	 }

     private: System::Void button2_Click_1(System::Object^  sender, System::EventArgs^  e) {
		 mPlayFlag1 = false;
		 MyForm7^ Frm7 = gcnew MyForm7();
		 this->Visible = false;     //画面を消す
		 Frm7->ShowDialog(this);
     }


### 自分で試したこと
スタック容量は増やしましたが切り替え回数が増えるだけでした。

Frm7->ShowDialog(this);
を
Frm7->Show(this);
に変更したら特定の回数は越える事が出来ましたがスタックオーバーフローが起きないか自信がありません。
解決方法等アドバイスがあれば教えてください。
0

1Answer

適当に推察するにShowDialogは呼び出したダイアログを閉じる(≠非表示)まで制御が戻らないので、
その先のダイアログで閉じずに同じようにShowDialogして…という形で遷移をくりかえしてたら
そりゃスタックオーバーフローするだろうなぁ・・・

0

Your answer might help someone💌