記事"Net Framework および C# に基づくグラフィカル インターフェイスの開発 (パート 2): その他のグラフィカル要素"についてのディスカッション - ページ 2

 
fxsaber:

C#-windows での作業で非常に深刻なエラーが検出された。C#ウィンドウを動かし続けると、数秒後にターミナルが画面から消えてしまい、terminal64.exeのCPUコア負荷が100%を超えてしまう。私は8コアなので、CPUのTaskManagerのフルコア負荷は12-13%です。C#ウィンドウが動いているときは19%。

おお、クールだ。試してみると、本当に消えます。というか、消えず、まるで「最小化」ボタンを押したかのようにトレイに最小化される。

100%ロードについては、私は見ていません。おそらく、あなたにはそれが組み込まれていて、私には組み込まれていないからでしょう。

 
fxsaber:

GuiControllerElementsDemoを ターミナルメニューから手動で削除すると、数秒間フリーズする。

そのようなことがあります。事前に手動でフォームを閉じていない場合にのみ発生します。回避方法はまだわかりません。Deinit()でフォームを閉じる方法をいくつか試しましたが、どれもうまくいきませんでした。どなたか方法をご存じでしたら教えてください。

 
Vasiliy Sokolov:

これがある。あらかじめ手動でフォームを閉じておかないと起きない。これを回避する方法はまだわからない。Deinit()でフォームを消滅させる方法をいくつか試したが、どれもうまくいかなかった。誰か方法を知っていたら教えてほしい。

なぜ標準のハンドラ private void Form2_FormClosing(object sender, FormClosingEventArgs e)

が動作しないのでしょうか?

C#でdllの実験をしていたとき、なぜか終了時にすべてがクラッシュした:

public partial class Form2 : Form

    {

        static RichTextBox CopyToClipboard;

.....

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

 CopyToClipboard.Clear();

 CopyToClipboard = null;

MQLからフォームを閉じる前に破棄しないと、ひどく遅くなったり、クラッシュしたりしました。

 
Vasiliy Sokolov:

おお、クールだ。試してみたら、確かに消えた。というか、消えず、「最小化」ボタンが押されたかのようにトレイに最小化される。

ターミナル・ウィンドウ自体を動かしてみた(C#は起動していない)。約10秒で、まったくすべてのウィンドウ(ME、ブラウザなど)が最小化され、デスクトップがむき出しになった。

100%のロードについては、私はそれを見ません。おそらくそれは、あなたにはそれが組み込まれていて、私には組み込まれていないからでしょう。


同時にExpert Advisorの実行もモニターしてみた。これがその結果だ。

2019.06.11 17:37:29
2019.06.11 17:37:30
2019.06.11 17:37:54
2019.06.11 17:38:06
2019.06.11 17:38:07
2019.06.11 17:38:08

ターミナル・ウインドウが動いている間、Expert Advisorの動作が停止しているのがよくわかる。

 
fxsaber:

同時にExpert Advisorの実行もモニターした。結果は以下の通りだ。

ターミナル・ウインドウが動いている間、Expert Advisorが動作を停止していることがよくわかる。

タイマーで確認しましたが、ハングアップは見られませんでした。ログへの送信も非常に速い。

 
Igor Makanu:

そして、なぜ標準ハンドラ private void Form2_FormClosing(object sender, FormClosingEventArgs e) なのか?

が動作しないのでしょうか?

C#でdllの実験をしていたとき、なぜか終了時にすべてがクラッシュしてしまった:

MQLからフォームを閉じる前に破棄しないと、ものすごく遅くなったり、クラッシュしたりしました。

私は、標準のform.Dispose()を使おうとしました。つまり、GuiController::HideForm()が呼ばれると、対応するフォームのDisposeが呼ばれる。 C#のテストアプリケーションではすべてうまくいった。しかし、MTではうまくいかない。しかし、Expert Advisorを削除する前に手動でフォームを閉じると、すべてうまくいく。

 
Vasiliy Sokolov:

標準の form.Dispose() を使ってやってみました。つまり、GuiController::HideForm()が呼び出されると、対応するフォームのDisposeが呼び出される。 C#のテストアプリケーションではすべてうまくいった。しかし、MTではうまくいかない。しかし、Expert Advisor を削除する前に手動でフォームを閉じると、すべてうまくいく。

ここでは 即座にアンロードされる。

 
fxsaber:

ここでは 即座にアンロードされる

はい、パネルを拝見しました。どの関数を使ってアンロードしているのですか?

 
Vasiliy Sokolov:

標準の form.Dispose() を使ってやってみました。つまり、GuiController::HideForm()が呼び出されると、対応するフォームのDisposeが呼び出される。 C#のテストアプリケーションではすべてうまくいった。しかし、MTではうまくいかない。しかし、Expert Advisor を削除する前に手動でフォームを閉じると、すべてうまくいく。

ぜひググってみてほしい。いくつかのプロセスがウロウロしている。

あるいは、アプリケーションを閉じるには、やはりWindowsのForm.Close()を呼び出す必要がある。

https://stackoverflow.com/questions/3097364/c-sharp-form-close-vs-form-dispose

Close を呼び出さないことは、おそらく Win32 メッセージの送信を回避することになるでしょう。

Close にはイベントを発生させる (キャンセルできる) という利点があるので、(フォームの) 部外者は FormClosing と FormClosed を見て、それに応じて反応することができます。

フォームを単に破棄した場合に、FormClosing や FormClosed が発生するかどうかはわかりませんが、それはあなたの実験にお任せします。


Vasiliy Sokolov:

はい、あなたのパネルを見ました。どの関数を使ってアンロードしていますか?

.dllを呼び出すとき、私は2つのスレッドを作成し、ShowDialog()を介してその中で各フォームを実行し、Close() メソッドの些細な呼び出しによってフォームを終了し、念のためにメモリを解放します。)
public static class FormsMT5
    {
        private static Form1 MainForm;
        private static Form2 OrderForm;
	 private static Thread ThreadMainform, ThreadOrderForm;
....................
 

public static void FormDeinit(int reason)
        {
            if (reason == 3 || reason == 5) return;
            if (MainForm != null)
            {
                MainForm.Close();
            }
            if (OrderForm != null)
            {
                OrderForm.Close();
            }
            if (ThreadMainform != null) ThreadMainform.Join();
            if (ThreadOrderForm != null) ThreadOrderForm.Join();
            MainForm = null;
            OrderForm = null;
            ThreadMainform = null;
            ThreadOrderForm = null;
        }
C# Form.Close vs Form.Dispose
C# Form.Close vs Form.Dispose
  • 2010.06.22
  • topgun_ivardtopgun_ivard 3,91683142
  • stackoverflow.com
I am new to C#, and I tried to look at the earlier posts but did not find a good answer. In a C# Windows Form Application with a single form, is using better or ? MSDN says that all resources within the object are closed and the form is disposed when...
 
Vasiliy Sokolov:

はい、あなたのパネルを見ました。どのファンクションを使ってアンロードしているのですか?

イゴールの パネルだよ。ちょうど公開したところだ。