2

プログラムのメイン フォームを希望どおりに実行するのに問題があります。私はC#を使用しています。最初のメイン フォーム (Form1) には、長いプログラムを実行するコマンド ボタンがあります。プログラムの途中で、ユーザーが最初のフォームに戻って、C# プログラム内からその最初のフォームに配置するいくつかの新しいチェックボックスをクリックできるようにしたいと考えています。以下のコードは、初期フォームをフリーズするだけです。以下のコードを正確に動作させる必要はありません。コマンドボタンで開始したプログラムの途中でメインの初期フォームにアクセスできるようにするために必要です。

これを行うには、タイマーを呼び出す無限 while ループがあります。これはこれを行う正しい方法ですか?以下のプログラムは必要ありません。プログラムの途中でその初期フォームにアクセスできるようにする必要があるだけです。それが機能していないので、これを行う方法ではないようですが、正しい方法は何ですか?

次のコードは、以下の OnTimedEvent 関数 (メソッド) を実行します。この関数はメッセージボックスを表示するために使用されていましたが、コメントアウトしました。その機能は必要ありません。テスト目的でのみ存在します。私の目標は、コマンド ボタンからの実行中に詳細情報を入力できるようにするために、最初のメイン フォームが必要であることです。以下の関数は約15回実行され、エラーが発生します

タイプ 'System.OutOfMemoryException' の例外がスローされました。

ライン上でaTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

コードは以下のとおりです。

System.Timers.Timer aTimer;
// Create a timer with a one second interval.
aTimer = new System.Timers.Timer(100);

while (true)
{
    // Hook up the event handler for the Elapsed event.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Only raise the event the first time Interval elapses.
    aTimer.AutoReset = false;
    aTimer.Enabled = true;  // uncommented this now
    //addded  below
    aTimer.Start();
}

いくつかの異なる方法で試しましたが、メインのフォームは常にフリーズします。メインフォーム( )で物事(チェックボックスなど)を選択できるようにしたいだけなForm1ので、以下のコードは必要ないかもしれません。上記のタイマーOnTimedEventは、以下の呼び出しを行います。

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
  // MessageBox.Show("Hello World");
}

Web 上の多くの場所 (stackoverflow を含む) で、タイマーを使用してメインの初期フォームを使用可能にする必要があることを確認しましたが、上記のコードではフォームが凍結され、フォームの上部にバーが表示されます。応答していないことを示します。Windows XP と Visual Studio 2008 を使用しています。上で示したように、C# を使用しています。

要約すると、上記のコードは、コマンド ボタンが実行された後にメインの初期フォームを使用できるようにする正しい方法ですか? もしそうなら、私は何を間違っていますか?これが正しい方法ではない場合、何が正しいのでしょうか?

ところで、ここでこのプロジェクトについてまったく関係のない質問をしました

何か案は?

4

4 に答える 4

3

whileループを削除するだけです

    System.Timers.Timer aTimer;
    // Create a timer with a one second interval.
    aTimer = new System.Timers.Timer(1000);
    // Hook up the event handler for the Elapsed event.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Only raise the event the first time Interval elapses.
    aTimer.AutoReset = false;
    aTimer.Enabled = true;  // uncommented this now
    //addded  below
    aTimer.Start();

タイマーは、開始時に別のスレッドで実行されます。while ループは、タイマーを何度も開始し続けます。

System.Timers.Timer

于 2013-04-24T18:54:39.637 に答える
2

これを行うには、タイマーを呼び出す無限 while ループがあります。これはこれを行う正しい方法ですか?

いいえ。 while ループは UI スレッドをブロックし、プログラムをフリーズさせます。whileすでにタイマーを使用してイベントをトリガーしているため、ループする理由はありません。

于 2013-04-24T18:56:44.890 に答える
1

while ループを使用しないでください。メソッドを 1 秒に 1 回実行する場合OnTimedEventは、次のようなものを使用します。

Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
myTimer.Interval = 1000; // 1000 ms is one second
myTimer.Enabled = true;
myTimer.Start();
于 2013-04-24T18:59:40.560 に答える
1

完全な実際のコードを見ないと、なんとも言えませんが、UI をロックせずに長時間実行されるプロセスを実行する従来の方法は、C# でスレッド化を使用することです。

UI スレッドをロックしないように、長時間実行されるアクションを独自のスレッドで実行できますか?

ここにチュートリアルがあります: http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

于 2013-04-24T18:57:48.763 に答える