2017-04-10 16 views
0

私が話す言語はVBです。スレッドとVBのGUI

私はこの問題に3週間以上苦しんでいますが、解決策はまだ見当たりません。 問題は次のとおりです: 私は、プロセス内で多くのGUIを変更しながら、強烈な計算をサブプロシージャで実行しています。短い時間が経過すると、アプリケーションはフリーズし、「応答していません」と表示されます。計算が終了すると、すべてが突然変更されたポイントにスナップされます。それについて特別なことは何もない。 しかし、スレッドでサブを起動しようとすると、アプリケーションがもうフリーズしないので、「スレッド自体では作成されていないため」GUIにアクセスできません。 どうすればこの問題を回避できますか? もっと具体的には:GUI(特にPictureBoxの幅と高さ)に関する情報にアクセスし、GUIを変更するにはどうすればよいですか(特にPictureBoxのBackgroundPictureを設定する)? 何か助けていただければ幸いです。ありがとうございました!

+1

Control.Invoke/BeginInvokeを例えば、これに対処https://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke –

+1

'BackgroundWorker'クラスは、この目的のために設計されています。 – JerryM

答えて

0
あなたは Dispatcherの使用方法をよく読んでする必要があります

MSDN Threading Model

一つだけのスレッドがUIを変更することができた場合、どのようにバックグラウンドスレッドは、ユーザーとの対話のですか?バックグラウンドスレッドはUIスレッドに代わって操作を実行するように要求できます。これは、UIスレッドのDispatcherに作業項目を登録することで行います。 Dispatcherクラスは、作業項目を登録する2つのメソッドを提供します。およびBeginInvokeを呼び出します。どちらのメソッドもデリゲートの実行をスケジュールします。 呼び出しは同期呼び出しです。つまり、UIスレッドが実際にデリゲートの実行を終了するまで戻りません。 BeginInvokeは非同期で、すぐにを返します。 MSDNの記事のリンクの例からのコードの

小snippit:

startStopButton.Dispatcher 
       .BeginInvoke(DispatcherPriority.Normal, 
          New NextPrimeDelegate(AddressOf CheckNextNumber)) 
+0

ありがとう、私はそれを試してみます。 :) –

+0

これはWPFの解決策であることに注意するのは良いことです。 OPがWinFormsを使用している場合、彼は[** 'Control.Invoke()' **](https://msdn.microsoft.com/en-us/library/zyzhdc6b(v = vs.110).aspx)を使用する必要があります)。 –

関連する問題