問題タブ [doevents]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Application.DoEvents() 内から例外をキャッチできますか?
VS2005 で実行されているプログラムと、実行可能ファイルを直接実行しているプログラムとの間に奇妙な違いがありました。基本的に、Application.DoEvents()
呼び出し内のメソッドで例外がスローされた場合、Visual Studio 内で実行しているときに例外をキャッチできます。コンパイルされた実行可能ファイルを実行すると、例外がキャッチされず、プログラムがクラッシュします。
問題を示す簡単なコードを次に示します。標準の winforms ボイラープレートと 2 つのボタンとラベルを想定します。
これを実行するには、開始ボタンをクリックして 10 秒のカウントを開始します。10 秒が経過する前に、中止ボタンを押します。の内部で例外がスローされますDoEvents()
。例外をキャッチする必要があります。これは、Visual Studio 内で実行している場合にのみ発生します。
これらの例外をキャッチできるようにしたい。それを機能させる方法はありますか?
アップデート:
re-entrant-headache-inducing 以外のアプローチも検討したいと思いDoEvents()
ます。しかし、私はよりうまく機能すると思われるものを見つけていません。私のシナリオは、いくつかの科学機器を制御している長時間実行ループがあり、温度が安定するなどを頻繁に待たなければならないというものです。ユーザーがプロセスを中止できるようにしたいので、プロセスが最初に開始されたサイトでキャッチするカスタム例外を単にスローする中止ボタンを用意しました。それは完璧な解決策のように思えました。何らかの理由で機能しないという事実を除いて。
これを機能させることができない場合、より良いアプローチはありますか?
更新 2:
これを Main() の最初の行として追加すると、実行可能ファイルとして機能しますが、VS では機能しないため、状況が逆になります。クレイジーなことは、ノーオペレーションのように見えることです。これがどのように機能するか理解できます。
これは非常識です。
doevents - Application.DoEvents、必要なときとそうでないときは?
使用する必要性は何Application.DoEvents
ですか?いつ使用する必要がありますか?
.net - Windowsフォームのクリックイベントが繰り返されます
Windows フォーム イベントで奇妙な問題が発生しました。正確には、KryptonHeaderGroupの ButtonSpec Click イベントですが、プレーン バニラでも発生しSystem.Windows.Forms.Button
ます。
クリック イベントでは、ユーザー インターフェイスがダウンし (ラベルとキャンセル ボタンが残っています)、以前のユーザー入力から高価な LINQ クエリが作成され、コンパイルされてから実行されます。Application.DoEvents()
foreach には、実際にクエリを実行する呼び出しがあります (オブジェクトへの LINQ であるため、遅延しています) 。これにより、ユーザーはキャンセルを押すことができます。その後、DoEvents
キャンセル フラグがテストされ、foreach がキャンセルされ、いくつかのクリーンアップが行われます。ここまでは順調ですね。
ただし、最初のいくつかの結果が表示された後に [キャンセル] ボタンを押すと (ラベルには既にいくつの結果が表示されているかが示されます)、Click イベント ハンドラー全体が再起動されます。いくつかのトレースを追加した後、これは前のハンドラーが戻る前に発生したようです。つまり、DoEvents
呼び出しの 1 つで発生します。もちろん、ボタンはもう一度押されません。ボタンがイベント ハンドラーで無効になっている場合は発生しません。しかし、ボタンは押されていないので、その Click イベントを再度発生させるべきではありません。
私は困惑しています。明らかに回避策はボタンを無効にすることですが、ここで実際の問題が何であるかを知りたいです。DoEvents
ハンドラが終了する前に が呼び出された場合、イベント ハンドラを再起動できますか? DoEvents
イベントハンドラーでの呼び出しは推奨/許可されていませんか? しかし、すべてがイベント駆動型アプリケーションのイベント ハンドラーであるため、それを呼び出すことはできません :)
この質問に答えるために必要な追加のヒント:
- LINQ クエリは、最初の結果を提供する前、つまり最初の
DoEvents
呼び出しが行われる前に、最初は長い時間がかかります。 - LINQ クエリは GUI スレッドで実行されます。ユーザーが残りのアプリケーションにアクセスできるようにするのは意味がないためです。アクセスは、GUI と LINQ クエリの両方が使用する基になる API に干渉するためです。
- アンロードできるようにするには、LINQ クエリを別のアプリ ドメインにロードしてそこで実行する必要があることはわかっています。ただし、一般的なユーザーが実行するクエリはほとんどなく、結果のアセンブリは (同じクエリ文字列に対して) キャッシュされます。
- ブレークポイントを有効にしている場合 (ため息- ハイゼンベルグ、誰か?)、または後でクエリ中にキャンセルした場合、問題は発生しなくなりました。
それが単なる推測であっても、動作を説明するものは何でも感謝します:)
wpf - WPFのカスタムモーダルウィンドウ?
モーダル動作を持つカスタムポップアップを作成したいWPFアプリケーションがあります。「DoEvents」に相当するものを使用してソリューションをハックすることができましたが、これを行うためのより良い方法はありますか?これが私が現在持っているものです:
私のModalHostは、アニメーションやその他のサポートを備えた別の要素をホストするように設計されたユーザーコントロールです。
vb.net - .net 2010は、カスタムコントロールライブラリ内からDoEvents(はい)を呼び出します
カスタムコントロールのライブラリがあります。これで、パネルのように見えるコントロールができました。それが開いたら、次のように垂直方向に成長するアニメーションを作成します。
ループ内でDoEventsを呼び出さないと、アニメーションは表示されず、途中で視覚的なフィードバックなしで最終的な高さを取得するだけです。
メインのWinFormプロジェクト内からDoEventsを呼び出すことはできますが、ライブラリ内から呼び出すことはできません。
深い糸の水に溺れることなく、どうすればそれを行うことができますか?
vb6 - DoEvents 中に VB6 プログラムがクラッシュするのはなぜですか?
Printer オブジェクトを使用してファイルを印刷する印刷アプリケーションがあります。ある特定のマシン (他のマシンではありません) では、このプログラムはいくつかのファイル (20 程度) を処理した後にクラッシュします。
クラッシュは常に DoEvents 呼び出し中に発生します。
誰もこのようなものを見たことがありますか?
ありがとう!
c# - Application.DoEvents() は私の唯一の選択肢ですか (この場合)?
機器メーカーが提供する .Net ライブラリに接続できる商用機器がいくつかあります。そのため、ライブラリや機器を制御することはできず、自分のコードのみを制御できます。
メーカーは、ライブラリ経由で機器に接続していない場合でも問題なく動作するようにシステムをセットアップしています。ただし、彼らのライブラリに接続する場合は、機器の実行速度によって設定された速度で Windows メッセージ ポンプを処理するという暗黙の要件があります。これは、彼らのライブラリが機器の動作を追跡するサブスクライブできるイベント システムを実装しているためですが、アプリケーション コードが WinForms ベースであることを前提としています。(しかし、彼らのドキュメントにはこれを明示的に述べているものは何もありません.2つの.NetサンプルプログラムはすべてWinFormsベースです.)私は彼らの技術サポートに、WinFormsアプリケーションを使用することを期待していることを確認しました.
私の場合、C# の非 WinForms ベースのアプリケーション (実際には Windows サービスであるため、UI スレッドはありません) を作成しており、機器に接続しているにもかかわらず、どのイベントにもサブスクライブしていません。その結果、サブスクライブしていないすべてのイベントを処理するには、WinForms アセンブリを参照し、Application.DoEvents() を十分な速度で呼び出す必要があることがわかりました。
だから私の質問はこれらです:
- この場合、私の唯一のオプションは Application.DoEvents() を呼び出すことですか?
- または、これを行うより現代的な方法はありますか?
- 20mS レートで DoEvents() を呼び出すと、どのような影響がありますか?
- 関係ありませんが、WPF ベースのアプリケーションを作成した場合、そのプログラムはメッセージ ポンプにサービスを提供する可能性がありますか?
編集
機器に接続し、Windows メッセージ ポンプにサービスを提供しない場合 (イベントのいずれにもサブスクライブしていなくても)、機器が予期せぬ動作を開始することを付け加えておきます。
編集 2
また、ライブラリとのインターフェイスに使用するスレッドは、最初の Windows サービス スレッドから約 2 世代または 3 世代分削除されています。
wpf - WPF Dispatcher.PushFrameとWinForms Application.DoEvents?
WinForms では、一部の人々から Application.DoEvents メソッドが悪と見なされてきました。WPF の Dispatcher.PushFrame に対応するものが安全に使用できるかどうかは誰にもわかりますか?
c# - C# BackgroundWorker - DoEvents を取り除く方法
ラジオボタンのクリックでトリガーされるバックグラウンドワーカーを処理する最良の方法を見つけようとしています。3 つのラジオ ボタンとラベルを持つ非常に単純なフォームを作成しました。各ラジオ ボタンは、同じイベント radioButton_CheckedChanged を共有します。イベントが完了したら、ラベルを「完了」に更新します。イベントが完了する前に別のラジオ ボタンをクリックすると、ラベルが Cancelled に更新されます。以下は、この簡単な例で書いたコードです。アプリケーションは期待どおりに実行される傾向がありますが、私の懸念は Application.DoEvents の使用です。これに対する私の代替手段は何ですか。明らかな理由で、IsBusy の間は眠れません。私はこれについてすべて間違っていますか、それともこれを行うためのより良い方法はありますか? ありがとう、ポコ