C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Win10 version1089 複数Form 起動エラー

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■91056 / inTopicNo.1)  Win10 version1089 複数Form 起動エラー
  
□投稿者/ 生技T (1回)-(2019/05/22(Wed) 13:13:32)

分類:[Windows 全般] 

C# .NET 4.5で以下のような使用方法を、問題なく使用していました。
(1つのFormから、他の5つのFormを起動する使い方です。)
ところが最近、Windows10のversion1089のアップデート後、
下記の、form4.Show()のところで、
System.OutOfMemoryException 'メモリが不足しています。'
とエラーが発生し使用不能となりました。
メモリの空き領域は十分あり、仮想メモリを増やしてみましたが、現象は変わりませんでした。
どなたか対策に心当たりのある人は、情報をお願いします。


FormOrg form1 = new FormOrg();
form1.Show();

FormOrg form2 = new FormOrg();
form2.Show();

FormOrg form3 = new FormOrg();
form3.Show();

FormOrg form4 = new FormOrg();
form4.Show();

FormOrg form5 = new FormOrg();
form5.Show();









引用返信 編集キー/
■91057 / inTopicNo.2)  Re[1]: Win10 version1089 複数Form 起動エラー
□投稿者/ PANG2 (291回)-(2019/05/22(Wed) 13:57:49)
for (int i = 0; i < 5; i++) {
Form f = new Form();
f.Show();
System.Diagnostics.Debug.WriteLine("GetTotalMemory = " + GC.GetTotalMemory(false));
}

空Formだと問題はないので、FormOrg に何らかの問題があることになります。
引用返信 編集キー/
■91059 / inTopicNo.3)  Re[2]: Win10 version1089 複数Form 起動エラー
□投稿者/ 生技T (3回)-(2019/05/23(Thu) 10:52:05)
No91057 (PANG2 さん) に返信
> for (int i = 0; i < 5; i++) {
> Form f = new Form();
> f.Show();
> System.Diagnostics.Debug.WriteLine("GetTotalMemory = " + GC.GetTotalMemory(false));
> }
>
> 空Formだと問題はないので、FormOrg に何らかの問題があることになります。

情報ありがとうございます。
確かにシンプルなFormですと問題ありませんでした。
使用していたFormOrgは、機器の詳細を表示する為、Button、TextBox等2000個程度は使用しています。
上記プログラムを参考にMemoryの増加を調べましたが、Form起動のたびに、2Mbyte以内でした。
この程度でメモリ不足になるとは考えにくいです。
Windows7においては、2年以上使用していたFormなので、変更すべきか悩んでいるところです。

引用返信 編集キー/
■91070 / inTopicNo.4)  Re[3]: Win10 version1089 複数Form 起動エラー
□投稿者/ PANG2 (292回)-(2019/05/24(Fri) 17:11:51)
2019/05/24(Fri) 17:45:03 編集(投稿者)

コントロールを2000個貼り付ける画面を5個起動すると、確かにエラーになりますね。

private void Form2_Load(object sender, EventArgs e)
{
for (int i = 0; i < 2000; i++) {
TextBox t = new TextBox();
this.Controls.Add(t);
}
}

例外
System.ComponentModel.Win32Exception はハンドルされませんでした。
Message=ウィンドウのハンドルを作成中にエラーが発生しました。
NativeErrorCode=1158
Source=System.Windows.Forms
StackTrace:
場所 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
場所 System.Windows.Forms.Control.CreateHandle()

引用返信 編集キー/
■91071 / inTopicNo.5)  Re[4]: Win10 version1089 複数Form 起動エラー
□投稿者/ 774RR (689回)-(2019/05/24(Fri) 22:31:43)
https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--1000-1299-
ERROR_NO_MORE_USER_HANDLES (1158)
このプロセスはウインドウマネージャ用のハンドルの許容範囲を超えました
ってことでメモリではなくてシステムリソースの超過っぽいっすね。

Windows 10 の更新によって、1つのフォームオブジェクトの中で使っている HWND が倍になったとか
そういう原因で HWND 数が超過しているものと思われます。要は Windows の仕様変更が原因。
バグだとインシデント報告するしかないっすね。

WPF は HWND 使わずにあれこれ自前実装してるんだっけ? なら WPF アプリにすれば動くかも。

引用返信 編集キー/
■91073 / inTopicNo.6)  Re[4]: Win10 version1089 複数Form 起動エラー
□投稿者/ Azulean (1061回)-(2019/05/24(Fri) 22:57:32)
2019/05/24(Fri) 23:14:47 編集(投稿者)

No91070 (PANG2 さん) に返信
> コントロールを2000個貼り付ける画面を5個起動すると、確かにエラーになりますね。

これは 1 プロセスあたりの GDI オブジェクトの限界(10,000)に到達しているのだと思います。

質問者の現象とも違うのかと思っていましたが、サンプルが 5 個繰り返してますね…。
元々大丈夫だったという環境で GDI オブジェクトの消費状況が違ったのかもしれませんが、あまり望まれていない設計ではありますね。

-----
大量のコントロール&スクロールするアプリは推奨しませんって記事もあるぐらいなので、たくさんコントロールを置く画面はアンチパターンだと思っています。
https://blogs.technet.microsoft.com/askcorejp/2018/03/15/dwm-%E3%81%8C%E6%9C%89%E5%8A%B9%E3%81%A7%E3%81%82%E3%82%8B%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81%E5%A4%9A%E6%95%B0%E3%81%AE%E5%AD%90%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89/
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ