[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 12/23 22:07 / Filesize : 101 KB / Number-of Response : 406
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれDelphi(超初心者用)その49



1 名前:デフォルトの名無しさん [2009/02/22(日) 22:10:29 ]
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を
勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その48
pc11.2ch.net/test/read.cgi/tech/1225641040/

<過去スレ>
DelWiki避難所(Delphi 関連の過去スレッド)
delwiki.info/?%E3%83%AA%E3%83%B3%E3%82%AF%2F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%2FDelphi%20%E9%96%A2%E9%80%A3%E3%81%AE%E9%81%8E%E5%8E%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89


397 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 23:11:33 ]
マルチスレッド歴1ヶ月のおいらがわかる事はとりあえず、
ImageList.Addメソッドの呼び出しは最低限、クリティカルセクションなりを用いて排他制御
しなきゃいけなさそうと言う事だけ。
後はわかんない。ぷぎゃ。
CriticalSection.Accuire;
try
ImageList.Add
finally
CriticalSection.Release;
end;

398 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 00:36:07 ]
いや、いらないからw

399 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:01:10 ]
>>397だけど、今、具体的にImageListのAddメソッド追ってみたけど、
内部でHandleNeededが呼ばれて、そのHandleNeededでフィールドのFHandleを参照しているから、
下手すると、
procedure TCustomImageList.HandleNeeded;
begin
if FHandle = 0 then CreateImageList;
end;
で、CreateImageListに複数のスレッドが同時に突入すると、イメージリストのハンドル
が複数作成され、迷子になっちゃわない?
ハンドルリークだから、まぁ、そこまで被害拡大しないと思うけど。


400 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:12:08 ]
ああ、というか、そもそも前提がお互い違うのかもね。
おいらの場合は、サムネイル作成するサブスレッドでImageListのAddメソッド
呼ぶ事を前提にしてた(それで出来るか分からないけど、ぷぎゃ)。
メインスレッドだけで、ImageList.Addメソッド呼ぶなら必要ないと思う。


401 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:47:39 ]
Thumnailer := TThumnailer.Create(True, FileName, Size, Bitmap);

Thumnailer := TThumnailer.Create(True, FileName, Size);
だった。orz


405 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:51:34 ]
「こんなクラス名は嫌だ」








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<101KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef