- ベストアンサー
Delphiのマルチスレッドの割り込み処理について
- Delphiのマルチスレッドの割り込み処理についての要約文です。
- Delphiのマルチスレッドにおける割り込み処理について、Synchronizeメソッドの働きについて説明します。
- Delphiのマルチスレッドの割り込み処理において、Synchronizeメソッドが待機する動作について解説します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
実際にプログラムを作って試した訳ではありません。見当違いでしたらすみません。 BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。 ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。 例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。 また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。
その他の回答 (1)
- SHIMAPEE
- ベストアンサー率75% (154/203)
ANo.1のお礼に対するアドバイスです。勘違いでしたらすみません。 マルチスレッドで理想的なのは、各スレッドが自由に仕事をすることです。しかし現実には「PaintBoxを書き換える処理」等の競合があるので、それを回避するために部分的にSynchronizeやTCriticalSection等を使わなければなりません。 ですから、tomojyuuさんが書かれた、 >だからVCLコンポーネントをSynchronize内で使用しないとマルチスレッドにならないのです。 >グラフィックでは無く、数字にすれば、本来あるべき結果にはならないはず(推測ですが)です。 上記は表現の違いかもしれませんが、 ・マルチスレッドにしたからこそ、スレッドセーフが保証されていないVCLコンポーネントは、競合を回避する一つの方法としてSynchronize内で使わなければならないのです。 ・グラフィックではなくスレッド個々の配列を操作するだけにすれば、そもそもSynchronizeが必要な処理がありませんので、Synchronizeを使わなくても本来あるべき結果になります。配列は正しくソートされます。 となります。
お礼
2度の回答ありがとうございます。恐縮です。 <グラフィックではなく(中略)配列は正しくソートされます。 テストプログラムを作って実行した所、SHIMAPEEさんのアドバイス通りSynchronize無しでもマルチスレッドになりました。 優先順位を付けて実行したのです。
お礼
回答ありがとうございます。 DelphiのDemoフォルダ下にあるThreadsプログラムを動かしてみました。 自分でもSynchronizeメソッドの動きがわかるテストプログラムを作ってみました。わかった事はSynchronizeメソッドはメインVCLのスレッドという事...つまり字のごとしVCLのスレッドなのですね。だからVCLコンポーネントをSynchronize内で使用しないとマルチスレッドにならないのです。 例えば、demoのThreadsプログラムの「PaintBoxを書き換える処理」を グラフィックでは無く、数字にすれば、本来あるべき結果にはならないはず(推測ですが)です。