私はパネル内に2000個の32wx32hピクチャボックスしかグリッド状にしか持っていません。私はそれが問題だと思ったので、1,250ピクチャボックス(50w25h)に設定しました。同じ問題が発生しています。WinFormsパネルのスクロールバーがアプリをフリーズするのはなぜですか?
これはリアルタイムイベントループではありません。それは、イベントを待っているコントロールの束です。
私がしているのはスクロールダウンです。上手く動作します。左と右...うまく動作します。 1〜2分間スクロールすると、アプリ全体がフリーズします。
マイパネルの自動スクロールがTrueに設定されています。私のコードはスクロールバー上で動作しません。 10億個のPictureBoxをスクロールするだけです。
また、スクロールバーを無効にしてもアプリケーションが後でフリーズすることはないので、スクロールバーの問題であると考えています。
デバッガーは情報を提供していません。
プロセスメモリには、17.9MBが使用されていると記載されています。
以下の手順では、常に再現性があるようです。途中まで上下にスクロールし、マウスボタンを離し、右上の赤い「X」の方向に上に移動する窓、それは凍りつく。
その他の場合、垂直スクロールバーと水平スクロールバーを30秒間〜2分間動かすだけで、ランダムにフリーズします。
新しい注記:フリーズ中に、約5-10秒後にスクロールバーをもう一度動かすことができました。その後、短時間の凍結と繰り返しに戻ります。
が // Initialize a blank map
for (int row = 0; row < m_mapInfo.Rows; row++)
{
for (int col = 0; col < m_mapInfo.Columns; col++)
{
PictureBox pb = new PictureBox();
pb.Size = size;
Point loc = new Point(m_mapInfo.TileWidth * col, m_mapInfo.TileHeight * row);
Rectangle srcRect = new Rectangle(loc, size);
pb.Location = loc;
pb.Tag = -1;
pb.Name = String.Format("Col={0:00}-Row={1:00}", col, row);
pb.BackColor = Color.Gray;
pb.MouseDown += pbMap_MouseDown;
pb.MouseUp += pbMap_MouseUp;
pnlMap.Controls.Add(pb);
}
}
PictureBoxは、このうちの多くを1つのフォームに表示する場合に使用する重いコントロールです。これは、フォームがまったく機能している奇跡に近いものです。代わりに、あなたは手作業でフォームの表面に必要な画像を描画する必要があります。これは、リソース消費量をはるかに少なくします。 – TruthSeeker
PictureBoxの便利なことは、セルのデータを保持するTagプロパティでした。各ピクチャボックスをクリックして特定のイベントを発生させることもできます。パネルに直接描画するとこれらの利点が得られるのかどうかはわかりませんが、別のデザインの観点から見る必要があります。 AutoScrollをfalseにすると、同じ量のPictureBoxに問題はありません。スクロールバーが表示されていないパネルには表示されていないので、問題は明らかではありません。私もちょうど17.9 MBを使用しているので、メモリ的には小さく見えます。リソースの混雑は別の問題かもしれません。 – Phil
_2,000 32wx32h PictureBoxes_Ouch!あまりにも多くの方法! GpはDGVを撮ったか、直接描く! – TaW