電子書籍の厳選無料作品が豊富!

Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して
クラス名.Execute関数内でSynchronizeメソッドを使用しています。
本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか?
Procedure MyThread.Execute
begin
Synchronize(AAA); AAAの処理が終了するまで待機している
end;
Procedure TmyThread.AAA;
begin
'したい処理'
end;

A 回答 (2件)

実際にプログラムを作って試した訳ではありません。

見当違いでしたらすみません。

BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。

ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。

例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。

また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
DelphiのDemoフォルダ下にあるThreadsプログラムを動かしてみました。
自分でもSynchronizeメソッドの動きがわかるテストプログラムを作ってみました。わかった事はSynchronizeメソッドはメインVCLのスレッドという事...つまり字のごとしVCLのスレッドなのですね。だからVCLコンポーネントをSynchronize内で使用しないとマルチスレッドにならないのです。
例えば、demoのThreadsプログラムの「PaintBoxを書き換える処理」を
グラフィックでは無く、数字にすれば、本来あるべき結果にはならないはず(推測ですが)です。

お礼日時:2006/10/15 20:42

ANo.1のお礼に対するアドバイスです。

勘違いでしたらすみません。

マルチスレッドで理想的なのは、各スレッドが自由に仕事をすることです。しかし現実には「PaintBoxを書き換える処理」等の競合があるので、それを回避するために部分的にSynchronizeやTCriticalSection等を使わなければなりません。

ですから、tomojyuuさんが書かれた、

>だからVCLコンポーネントをSynchronize内で使用しないとマルチスレッドにならないのです。

>グラフィックでは無く、数字にすれば、本来あるべき結果にはならないはず(推測ですが)です。

上記は表現の違いかもしれませんが、

・マルチスレッドにしたからこそ、スレッドセーフが保証されていないVCLコンポーネントは、競合を回避する一つの方法としてSynchronize内で使わなければならないのです。

・グラフィックではなくスレッド個々の配列を操作するだけにすれば、そもそもSynchronizeが必要な処理がありませんので、Synchronizeを使わなくても本来あるべき結果になります。配列は正しくソートされます。

となります。
    • good
    • 0
この回答へのお礼

2度の回答ありがとうございます。恐縮です。
<グラフィックではなく(中略)配列は正しくソートされます。
テストプログラムを作って実行した所、SHIMAPEEさんのアドバイス通りSynchronize無しでもマルチスレッドになりました。
優先順位を付けて実行したのです。

お礼日時:2006/10/16 10:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!