2017-06-21 7 views
0

ビジュアルスタジオで書かれたwinformsプログラムがVisual Basicでコーディングされています。VBプログラムはフリーズフリーズしますが、それでも応答しますか?

プログラムの主要部分は、シリアルコマンドを送信し、SQLにデータを書き込み、基本的な算術演算を行い、自分のフォームのコントロールを更新するwhileループです。私はバックグラウンドワーカーのループは、バックグラウンドワーカーからまだバックグラウンドで動作している間、コントロールを更新することができるように、作業サブを行います。しばらくして実行すると、フォームがフリーズし、いくつかのテキストボックスを更新する途中になります。しかし、バックグラウンドワーカーは引き続き実行されますが、SQLデータはまだ書き込まれています。ボタンが押されたことがわからなくても、フォーム上のボタンをクリックするのは不思議なことです。

視覚的にフォームが固定されているが、すべてのコントロールがまだ応答するような動作を引き起こすものは考えられません。

+0

UIより速くワーカースレッドから呼び出すことができます。タスクマネージャーから気付かれるはずですが、100%コアを焼いているはずです。そしてそれはますます多くのメモリを使用して、最終的にあなたのプログラムをクラッシュさせることを見てください。遅くなる必要があります。 TextBoxにテキストを無限に追加するのではなく、しばらくして古いテキストを投げ捨てる必要があります。 –

+0

'私はバックグラウンドワーカーでループをしているので、バックグラウンドワーカーからコントロールを更新することができますので、どのように動作するのかはわかりません。 BGW上で作業を行い、UIスレッドのみからUIを更新します。 BGWには進行状況を報告するための方法とイベントが含まれています – Plutonix

答えて

0

UIスレッドがループしているためにフリーズします。バックグラウンドワーカーを適切に実装しておらず、UIスレッドにアタッチされているようです。

ループのどこかにDoEventsを追加すると、UIスレッドにUIイベントを処理する時間が与えられます。しかし、私はあなたのコードを知らないので、これはちょうどバンドエイドの修正です。理想的な方法は、バックグラウンドワーカーとUIスレッドとの関係を修正することです。

+0

詳細を教えてください。 DoEventsは何をしていますか、なぜこの問題を解決するのに役立つと思いますか? – JonW

+0

更新を参照してください。 –

+0

DoEventsは使用しないでください。コードに適切なバックグラウンド/スレッディングソリューションを実装します。 @JonW – Jaxedin