読み込みに時間がかかる大きな winform アプリケーションがあるので、そのアプリケーション用のスプラッシュ スクリーンを作成しました。
問題は、新しいスレッドからスプラッシュ フォームを表示すると、読み込み中にプログレス バーが 2 ~ 3 回フリーズすることです。でも、別工程でやると何の問題もなくスムーズに動きます。
このような状況で、新しいスレッドと別のプロセスの違いは何なのか知りたいです。
ありがとう
読み込みに時間がかかる大きな winform アプリケーションがあるので、そのアプリケーション用のスプラッシュ スクリーンを作成しました。
問題は、新しいスレッドからスプラッシュ フォームを表示すると、読み込み中にプログレス バーが 2 ~ 3 回フリーズすることです。でも、別工程でやると何の問題もなくスムーズに動きます。
このような状況で、新しいスレッドと別のプロセスの違いは何なのか知りたいです。
ありがとう
メインフォームには独自のスレッドがあると単純に考えてください。そのスレッドでタスク集中型の処理を行っている場合、UI を更新する機会がありません。ただし、新しいスレッドを作成すると、メイン フォームのスレッドがワークロードを実行している間に、スプラッシュ スクリーン UI を更新できる新しいワーカーを作成することになります。
プロセスは、アプリケーションの実行中のインスタンスです。たとえば、Microsoft Word アイコンをダブルクリックすると、Word を実行するプロセスが開始されます。スレッドは、プロセス内の実行パスです。また、プロセスには複数のスレッドを含めることができます。Word を起動すると、オペレーティング システムによってプロセスが作成され、そのプロセスのプライマリ スレッドの実行が開始されます。
スレッドとプロセスのもう 1 つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有しますが、別のプロセスは共有しないことです。
これは、スプラッシュ スクリーンの UI が、完全に別の Windows メッセージ キューを持つメイン ウィンドウとは完全に別のスレッドにある必要があるためである可能性があります。
メイン スレッドとは別のスレッドで UI を実行するには、新しいメッセージ ポンプを開始する必要があります。これは、メッセージ キューをスレッド間で共有できないためです。
新しいメッセージ ポンプを開始するにApplication.Run(yourSplashScreen);
は、別のスレッドから呼び出します。別のスレッドからもスプラッシュ スクリーン フォームを作成します。
別のスレッドで開始した別のフォームで実行されているコードから、あるフォームのコントロールを直接操作することはできないことに注意してください。Control.Invoke()
通常、複数のスレッドで行うのと同じように、使用する必要があります。
いずれにせよ、このように別のメッセージ キューを使用すると、表示されている停止を防ぐのに役立つ可能性があります。