掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
FMX-TBitmapはThread-safe? (ID:151817)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
とても外していたらすいません。 TTask.Runがどのように呼ばれているかによるのですが、 例1:Stream、HTTPClient、Bitmapをローカルで作成する TTask.Run(procedure var LocalHTTPClient:THTTPClient; LocalBitmap:TBitmap; LocalStream:TMemoryStream; begin LocalHTTPClient := THTTPClient.Create; LocalBitmap:=TBitmap.Create; try LocalStream:=TMemoryStream.Create; LocalHTTPClient.Get(URL, LocalStream); LocalBitmap.LoadFromStream(LocalStream); // 必要であれば加工 ... // UI更新 TThread.Synchronize(nil, procedure begin Image1.Bitmap := LocalBitmap; end); finally LocalHTTPClient.Free; LocalBitmap.Free; end; end); 例2:Stream、HTTPClient、Bitmapをロックする TTask.Run(procedure begin System.MonitorEnter(Stream); System.MonitorEnter(HTTPClient); HTTPClient.Get(URL, Stream); System.MonitorExit(HTTPClient); System.MonitorEnter(Bitmap); Bitmap.LoadFromStream(Stream); System.MonitorExit(Stream); // 必要であれば加工 ... // UI更新 TThread.Synchronize(nil, procedure begin Image1.Bitmap := Bitmap; end); System.MonitorExit(Bitmap); end); 例3:全てSynchronize内で実行する(TTaskの意味がなくなる) TTask.Run(procedure begin TThread.Synchronize(nil, procedure begin HTTPClient.Get(URL, Stream); Bitmap.LoadFromStream(Stream); // 必要であれば加工 ... // UI更新 Image1.Bitmap := Bitmap; end); end); TTask.Runの呼び方によっては URL:String も気になります。 並列プログラミングにおいては 複数のタスクが開始する順序と終了する順序は保証されません。 TTaskやITaskを実際に実用的に使おうとするとTTaskの派生クラスを作って使用せざるを得なくなります。 例えば以下のソースコードの場合、 1個目のTTask.Runと2個目のTTask.Runが順番に実行開始されるとは限らないのです。 1個目のTTask.Runと2個目のTTask.Runが順番に実行終了するとも限りません。 よって、'1回目'、'2回目'の順に表示される可能性もありますし、 '2回目'、'1回目'の順に表示される可能性もありますし、 '2回目'、'2回目'の順に表示される可能性もあります。 var URL:String begin URL:='1回目'; TTask.Run( procedure begin ShowMessage(URL)+ end ); URL:='2回目'; TTask.Run( procedure begin ShowMessage(URL)+ end ); end; 参考URL https://mam-mam.net/delphi/vcl_ttask.html 間違っていたら、誠に申し訳ございません。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.