2

私が分析しているマルチスレッドアプリケーションで少し迷っています。私が理解しようとしている関数はメインスレッドで動作すると思いました。クリティカル セクションの開始と終了のコードを配置したことを確認します。同じクリティカル セクションは、プログラムの起動 (クリティカル セクションに入る) と終了 (クリティカル セクションから出る) でも使用されます。

私が間違っている場合は修正してください。関数がメイン スレッドで動作する場合、クリティカル セクションへの入力を許可する必要があります。しかし、そうではありません - 私の機能はクリティカルセクションに入ると停止します。私の理解によると、この関数は別のスレッドで機能します。

どの関数がどのスレッドで動作するかを理解するための私の方法は正しいですか?

4

3 に答える 3

4

デバッガを使用するだけです。アプリのスタートアップ コードまたはアプリ内の任意のメッセージ ハンドラーにブレークポイントを設定し、デバッガー スレッド ウィンドウで現在のスレッド ID を確認します。次に、問題の関数にブレークポイントを設定し、実行がその関数に到達したときにスレッド ID を確認します。それらが一致しない場合、UI メッセージが実行されているのと同じスレッドで関数が呼び出されていません。

デバッガーで関数を停止している間に、コール スタック ウィンドウを見て、関数呼び出しにつながった一連の呼び出しを確認できます。これにより、どのようにしてそこにたどり着いたか、および別のスレッドでどのようにそこにたどり着いたかについての洞察が得られる場合があります。

于 2012-08-28T16:28:17.633 に答える
0

クリティカル セクションを間違った方法で使用していると思います。メインスレッドと他のスレッドで変更される可能性のある変数があるとします。この変数にアクセスするたびに、まずAcquireクリティカル セクションにアクセスします。このような:

if MyCriticalSection.TryEnter then  // MyVariable is accessible
begin
  MyVariable := MyVariable + 1;
  MyCriticalSection.Release;
end
else begin
  // do something useful and try again in a few milliseconds.
end;

を呼び出すとAcquire、クリティカル セクションが利用可能になるまで、呼び出し元のスレッドが凍結されることに注意してください。そのため、Acquireアプリケーションの開始時に呼び出すと、2 回目の呼び出しでメイン スレッドがフリーズします。

于 2012-08-29T12:51:44.177 に答える