
Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して
クラス名.Execute関数内でSynchronizeメソッドを使用しています。
本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか?
Procedure MyThread.Execute
begin
Synchronize(AAA); AAAの処理が終了するまで待機している
end;
Procedure TmyThread.AAA;
begin
'したい処理'
end;
No.1ベストアンサー
- 回答日時:
実際にプログラムを作って試した訳ではありません。
見当違いでしたらすみません。BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。
ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。
例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。
また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。
回答ありがとうございます。
DelphiのDemoフォルダ下にあるThreadsプログラムを動かしてみました。
自分でもSynchronizeメソッドの動きがわかるテストプログラムを作ってみました。わかった事はSynchronizeメソッドはメインVCLのスレッドという事...つまり字のごとしVCLのスレッドなのですね。だからVCLコンポーネントをSynchronize内で使用しないとマルチスレッドにならないのです。
例えば、demoのThreadsプログラムの「PaintBoxを書き換える処理」を
グラフィックでは無く、数字にすれば、本来あるべき結果にはならないはず(推測ですが)です。
No.2
- 回答日時:
ANo.1のお礼に対するアドバイスです。
勘違いでしたらすみません。マルチスレッドで理想的なのは、各スレッドが自由に仕事をすることです。しかし現実には「PaintBoxを書き換える処理」等の競合があるので、それを回避するために部分的にSynchronizeやTCriticalSection等を使わなければなりません。
ですから、tomojyuuさんが書かれた、
>だからVCLコンポーネントをSynchronize内で使用しないとマルチスレッドにならないのです。
>グラフィックでは無く、数字にすれば、本来あるべき結果にはならないはず(推測ですが)です。
上記は表現の違いかもしれませんが、
・マルチスレッドにしたからこそ、スレッドセーフが保証されていないVCLコンポーネントは、競合を回避する一つの方法としてSynchronize内で使わなければならないのです。
・グラフィックではなくスレッド個々の配列を操作するだけにすれば、そもそもSynchronizeが必要な処理がありませんので、Synchronizeを使わなくても本来あるべき結果になります。配列は正しくソートされます。
となります。
2度の回答ありがとうございます。恐縮です。
<グラフィックではなく(中略)配列は正しくソートされます。
テストプログラムを作って実行した所、SHIMAPEEさんのアドバイス通りSynchronize無しでもマルチスレッドになりました。
優先順位を付けて実行したのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) vbaエクセルマクロについて RemoveDuplicatesを使わずに、重複行を削除すらマクロを作 3 2023/03/02 22:03
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaのプログラムが止まる
-
java(swing)で、登録ボタンを押...
-
Javaプログラムからポップアッ...
-
Javaでのデバッグコード削除
-
jqueryのmouseenterイベントの...
-
数値の定数を付ける時
-
tryの終了
-
Javaアプリケーション実行の返...
-
インスタンス参照でアクセスで...
-
if文が通りません。。。
-
C++で*thisは何を指しているの...
-
「タイプ初期化子が例外をスロ...
-
singletonクラスとは???
-
メソッドが値を返すとき
-
C# インスタンスの破棄
-
DataGridViewでセルクリックイ...
-
複数の変数を宣言する時、同時...
-
僕の出身中学校は200人同級生が...
-
戻り値のないメソッド
-
検索した後の見つかった件数を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Java] while(true)の意味
-
tryの終了
-
Javaでのデバッグコード削除
-
Javaアプリケーション実行の返...
-
Javaプログラムからポップアッ...
-
onBlurとonFocusの処理順序につ...
-
Tomcat高負荷時の設定について
-
数値の定数を付ける時
-
アコーディオンメニューをアン...
-
ラジオボタンの選択判定
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
C#で別スレッドの終了を知りたい
-
素数判定を再帰処理で
-
JavaScriptからJAVAクラスを呼...
-
switch文の中に、throws new Ex...
-
PHPでDB処理中にプログレスバー...
-
C#の処理をリアルタイムに表示...
-
Windowsサービスの処理
-
ftp 同時複数接続の負荷テスト...
おすすめ情報