3

これに対する答えがどこにも見つからないようです。どう表現すればよいか分からない。

フォーム上のコントロール宛てのメッセージは、互いに並行して処理されますか?

私は常に、スレッド アパートメントごとに 1 つのメッセージ ポンプがあり、1 つのポンプがそのスレッドに接続された GUI 全体にフィードするという印象を受けていました。では、1 つのコントロールで wndproc にフックしてスレッド (Thread.Sleep()) をフリーズすると、フォーム全体がフリーズするのでしょうか?

もしそうなら、この質問は、特定のメッセージが子コントロールに到着したときにスリープすることによって、隣接するコントロールが次のメッセージを処理したことを証明しているようです。どのように?

4

1 に答える 1

3

メッセージは厳密にシリアルに処理されます。その Q+A のタイムスタンプに惑わされないでください。メッセージが実際にマイクロ秒間隔で到着したことを示すのに十分な数字が分数にないだけです。メッセージ ハンドラーは非常に高速です。これは正常です。

コードは、複数のスレッドがある場合にのみ並列実行されます。これはユーザー インターフェイスにとって有害で​​あり、コードの大きな塊は決してスレッド セーフではありません。小さなチャンクでさえ、List<> のような非常に基本的な .NET クラスはそうではありません。コードをスレッド セーフに保つには、難しい方法であり、小さなコードでしかできない方法であるロックを使用するか、常に 1 つの特定のスレッドで実行されるようにする必要があります。

UI がスレッドセーフではないため、メッセージ ループが存在します。これは、生産者と消費者の問題に対する普遍的な解決策です。オペレーティング システムのスレッドと他のプロセスが生成し、UI スレッドが消費します。

于 2015-10-16T10:29:12.657 に答える