|
2020/10/14(Wed) 15:37:33 編集(投稿者)
■No95983 (コーヒー好き さん) に返信 > Form2の×ボタンで押してCloseメソッドでDisposeしてしまっていますが、 > ×ボタンでDisposeせずに、hideにすることはできるのでしょうか?
FormClosing イベントで、e.CloseReason を確認し、 ユーザー操作(UserClosing)で閉じられた場合は、 e.Cancel = true; this.Hide(); としては如何でしょう。
ついでに、Form2 のオーナーフォームに Form1 を指定しておけば、 Form1 が閉じられたときに、Form2 も Dispose されるようになります。
> モーダレスで .NET Framework 界隈の場合は、 モーダレス(modal-less) ではなく モードレス(modeless) 表記の方が一般的です。
> Form1ではスレッドタイマーを用いてcountを加算させていき、 > count毎に1000個のデータをdouble型2次元配列 data[100000,1000] に格納させていく処理を行っています。
配列という事は……単純計算で 762.9 MiB 相当ですね。 これらすべてをオンメモリで保持しなければならないのですか? count が小さいうちは、後半部が使われないメモリ構造なのが気になりますが、 可変サイズにしていないということは、起動時にメモリを確保しておきたいという意図でしょうか。
1000 個単位でカウントアップされるようなので、恐らくは data[count, 0〜999] という形で管理されているのだと見受けました。
そうすると、たとえば count が 0 から 1 へと増えた場合、 data[1, 0〜999] の領域のみが Form2 に渡したい情報ということでしょうか。 あるいは data[0, 0〜999] の部分も、読み取り専用として扱われるのでしょうか。
ImmutableArray や ReadOnlySpan<> が使える環境でも無いでしょうし、 この配列を Form2 がどのように扱いたいのかが気になりました。
それと、スレッドタイマーが使われている点も厄介に思えます。
今回のデータは、count と data という 2 つの変数で管理されているようですが、 count および data の読み書きは、メインスレッドでしか行われない仕様でしょうか?
もしもその変数を、スレッドタイマーと UI スレッドの双方で利用しているのであれば、 「両変数の値を書き換えている最中」に、その内容が他から読み書きされない事を 何らかの形で保証する必要があろうかと思います。
> Form2ではForm1の data[100000,1000] のデータをグラフ化する処理を行っており、
データが 100,000,000 (1 億個)もあったら、グラフでは表現しきれないのではないでしょうか。 3840 x 2160 の 4K モニターでも、総ピクセル数はわずか 8,294,400 程度ですよね。
データ全体ではなく、データの一部のみ(たとえば 1000 個のみ)を受け渡すにしても、 2 次元配列で管理する仕様のままでは、扱いにくいと思いますよ。
・データの一部をコピーしてから渡す手法は、2 次元配列との相性が悪い。 ・データ全体を参照で渡す方法だと、スレッドセーフを保証するための維持コストが問題になるかもしれない。 ・データの一部のみを参照で受け渡す手法(ArraySegment<T> 等)も使えない。
|