2012-01-27 5 views
0

重い計算の間にかなり反応しないwinformアプリケーションがあります。例えば、ユーザーがF10キーを押すと、プログラムは重いものを起動し、しばらくの間応答しません(私はこれが望ましいプログラムフローではないことを知っていますが、現時点ではプログラムの動作方法を変更したくありません) 。プログラムが応答しないときにキャプチャキーを無効にする

この時点で、ユーザーがF10を再度押すと、プログラムは最初の処理を実行するとすぐに同じことを開始します。

特定のポイントでキャプチャキーを無効にしてもう一度有効にする方法はありますか?

+1

実際の問題(一時的なものは永久的になる)を修正して、計算をapbackgrounfスレッドに入れてください。タスク並列ライブラリを使用するのは本当に簡単です:http://msdn.microsoft.com/en-us/library/dd537609.aspx – Jason

+1

計算をBackgroundWorkerに移動して、フォームを無効にするだけで、完了コールバックが実行される育った? – dmay

答えて

2

プログラムは「キーをキャプチャしていません」というのは、メインのUIスレッドが計算に忙しいため、その時点で何も処理していないため、オペレーティングシステムによってキューに入れられています。あなたができることについて考えることができる唯一のことは、別の実行を許可する前に最後の実行が終了してから一定の時間が経過したことを確認することです。私の謙虚な意見の醜いハック。

しかし、なぜ、あなたはバックグラウンドワーカーやスレッドを使用する必要があります。 BackgroundWorkerを使用するのは、最初のように見えるよりはるかに簡単です。

+0

これらの理由により、まさにスレッディングが作成されます。いくつかの調査を行い、コアの問題を取り除く。さもなければ、修正する必要があるスタブのスタックで終わるでしょう。プロジェクト管理では「無限の欠陥戦略」と呼ばれます – Oybek

+0

タイマーの使用は決して良い選択ではありません - あなたのCPUが負荷を受けており、計算時間があなたのタイマーが設定されている時間よりもはるかに短い場合はどうなりますか?このシナリオを補ってタイマーを増やし、CPUが正常に負荷されていて、現在の計算が完了し、タイマーがUIを解放するのを待っているとします。どのような観点からも良い解決策ではありません。 – Bertie

+0

どこでタイマーの使用をお勧めしましたか?私はちょうど私の長期実行プロセスが終了した後すぐに変数の_lastRunMicroSecondsに現在のマイクロ秒を格納し、バッファのサイズを決定する必要があるcurrentMicroSeconds>(_lastRunMicroSeconds + bufferMicroSeconds)まで次の実行を許可しません。私はそれが良い解決策であるとは言いませんでした。 :) – Till

0

理想的には)あなたはここでBackgroundWorkerを使用する必要がありますが、あなたは

を言ったように私はプログラムは、現時点では動作方法を変更する必要はありません。

私はその道には行かないでしょう。

F-10を初めて検出したときにf-10を検出するたびにboolの値をtrueと次回に設定すると、boolがすでにtrueかどうかを確認できます。それがすでに真である場合、重い操作を再び開始しないでください。単にコードをスキップしてください。

重い処理の最後に、boolを再びfalseに設定します。

+0

これは、キーの押下イベントがプログラムに到達したときに、uiスレッドの重い作業が終了し、boolがtrueに戻されるため失敗します。 – Till

+0

私はブールが何かを修正するとは思わない、第二の重いプロセスが最初の終わりにすぐに始まるので。 – ken2k

0

私はJasonと全体的に同意します - ハックや一時的な修正は、プログラムの「機能」になるという厄介な癖があります。

しかし、あなたの質問に答えるために、私はあなたの計算が実行されている間、目的の機能を無効にするプログラムで無効フラグを持つことをお勧めします。次に、イベントハンドラにフラグのチェックを入れます:

public bool DisableFlag { get; set; } 

public void MyKeyEventHandler(object sender, EventArgs e) 
{ 
    if (DisableFlag) 
    { 
     return; 
    } 

    // Do stuff 
} 

希望に役立ちます。
乾杯、
Chris。

EDIT:

ケンのコメントを考えると、これは真実である、イベントがキューに入れられますし、それだけでいくつかのイベントを通じ、出血している限り、有用であろう。だから、他のオプションは

myControl =- MyKeyEventHandler; 

と計算が終了した後、

myControl =+ MyKeyEventHandler; 

を行うことによって完全にさえハンドラを無効にすることです。この方法では、イベントはキューに入れられず、Kenが説明したように問題を回避します。

+0

重いプロセスの終了後にKeyPressメッセージが処理されるため、何も修正されないとは思いません。プロセスの終了後にフラグを有効にする必要があるため、問題は残ります。 – ken2k

関連する問題