くだすれDelphi(超初 ..
397:デフォルトの名無しさん
09/05/03 23:11:33
マルチスレッド歴1ヶ月のおいらがわかる事はとりあえず、
ImageList.Addメソッドの呼び出しは最低限、クリティカルセクションなりを用いて排他制御
しなきゃいけなさそうと言う事だけ。
後はわかんない。ぷぎゃ。
CriticalSection.Accuire;
try
ImageList.Add
finally
CriticalSection.Release;
end;
398:デフォルトの名無しさん
09/05/04 00:36:07
いや、いらないからw
399:デフォルトの名無しさん
09/05/04 01:01:10
>>397だけど、今、具体的にImageListのAddメソッド追ってみたけど、
内部でHandleNeededが呼ばれて、そのHandleNeededでフィールドのFHandleを参照しているから、
下手すると、
procedure TCustomImageList.HandleNeeded;
begin
if FHandle = 0 then CreateImageList;
end;
で、CreateImageListに複数のスレッドが同時に突入すると、イメージリストのハンドル
が複数作成され、迷子になっちゃわない?
ハンドルリークだから、まぁ、そこまで被害拡大しないと思うけど。
400:デフォルトの名無しさん
09/05/04 01:12:08
ああ、というか、そもそも前提がお互い違うのかもね。
おいらの場合は、サムネイル作成するサブスレッドでImageListのAddメソッド
呼ぶ事を前提にしてた(それで出来るか分からないけど、ぷぎゃ)。
メインスレッドだけで、ImageList.Addメソッド呼ぶなら必要ないと思う。
401:デフォルトの名無しさん
09/05/04 01:42:09
勉強のため、勝手にちょっと作ってみたけど、今のおいらのレベルで作るとこんな感じかな。
TThumnailEvent = procedure (Sender: TObject; ABitmap: TBitmap) of object;
TThumnailer = class(TThread)
private
FFileName: string;
FSize: TSize;
FBitmap: TBitmap;
private
FOnThumnail: TThumnailEvent;
private
procedure CallOnThumnailEvent;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean; AFileName: string; ASize: TSize);
public
property OnThumnail: TThumnailEvent read FOnThumnail write FOnThumnail;
end;
402:デフォルトの名無しさん
09/05/04 01:43:02
で、実装は
{ TThumnailer }
constructor TThumnailer.Create(CreateSuspended: Boolean; AFileName: string; ASize: TSize);
begin
FFileName := AFileName;
FSize := ASize;
FBitmap := TBitmap.Create;
inherited Create(CreateSuspended);
end;
procedure TThumnailer.CallOnThumnailEvent;
begin
if Assigned(FOnThumnail) then
FOnThumnail(Self, FBitmap);
end;
procedure TThumnailer.Execute;
begin
// サムネイル作成処理
// ごにょごにょ
if Assigned(FOnThumnail) then
Synchronize(CallOnThumnailEvent); // VCLのメインスレッドど同期を取る
FBitmap.Free;
end;
403:デフォルトの名無しさん
09/05/04 01:46:47
メインのVCLスレッドでは、
procedure TMainForm.Button1Click(Sender: TObject);
var
Thumnailer: TThumnailer;
begin
Thumnailer := TThumnailer.Create(True, FileName, Size, Bitmap);
Thumnailer.FreeOnTerminate := True; // 自動破棄
Thumnailer.OnThumnail := OnThumnail;
Thumnailer.Resume;
end;
procedure TMainForm.OnThumnail(Sender: TObject; ABitmap: TBitmap);
begin
if ABitmap <> nil then
ImageList.Add(ABitmap);
end;
とか。ListView.OnDataHintとかは良くわかってないので省略。
404:デフォルトの名無しさん
09/05/04 01:47:39
Thumnailer := TThumnailer.Create(True, FileName, Size, Bitmap);
は
Thumnailer := TThumnailer.Create(True, FileName, Size);
だった。orz
405:デフォルトの名無しさん
09/05/04 01:51:34
「こんなクラス名は嫌だ」
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5175日前に更新/101 KB
担当:undef