全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:620
推到 Plurk!
推到 Facebook!

使用 TChart 在 TThread 中產圖,Free 物件時發生 System Error Code 5 拒絕存取。

尚未結案
Jiaga
一般會員


發表:1
回覆:1
積分:0
註冊:2013-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-05-27 00:29:27 IP:219.85.xxx.xxx 未訂閱
我自已寫了一個 TFrame 裡面放了一個 TChart。
在單獨使用時不管是顯示、產圖都很正常。

但在 TThread 裡面產圖會發生,圖檔不完整,我參考了下列網址說明。
http://www.teechart.net/support/viewtopic.php?f=3&t=7639

在產圖前先 TChart.Draw 到一個 TBitmap 再產圖,但在 Free 物件時會發生 System Error Code 5 拒絕存取。

不進行 TChart.Draw 就不會有這個問題,但就是圖檔不完整。

產圖在 Synchronize 進行就不用 TChart.Draw,產圖也都正常,但不想這樣寫。

想請問有什麼『System Error Code 5 拒絕存取』的處理方式,或注意的地方,謝謝。

Delphi XE 10.1
[code delphi]
procedure TfrmFormulaChart.SaveFormulaChartImage();
var
bmpChart: TBitmap;
wsChartFile: WideString;
begin
bmpChart := TBitmap.Create;
try
bmpChart.Width := self.Width;
bmpChart.Height := self.Height;
chtFormulaChart.Draw(bmpChart.Canvas, Rect(0, 0, bmpChart.Width, bmpChart.Height));
//bmpChart.SaveToFile(psImageFolder psMaxDate '_' psChartName '.bmp');

wsChartFile := psImageFolder psMaxDate '_' psChartName;
if (psImageFormat.CompareTo('PNG') = 0) then
TeeSaveToPNG(chtFormulaChart, wsChartFile '.png')
else if (psImageFormat.CompareTo('JPG') = 0) then
TeeSaveToJPEG(chtFormulaChart, wsChartFile '.jpg', -1, -1)
else if (psImageFormat.CompareTo('BMP') = 0) then
chtFormulaChart.SaveToBitmapFile(wsChartFile '.bmp');

finally
FreeAndNil(bmpChart);
end;
end;
[/code]
stacker_liew
初階會員


發表:50
回覆:116
積分:48
註冊:2004-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-08-25 02:30:17 IP:42.153.xxx.xxx 未訂閱
Delphi就是這樣,顯示畫面是在Main Thread,其它Thread若要存取它必需使用Synchronize進行,不然會有不可預料的後果發生。
除非你自己處理資源管理,那你就要去看TThead的原始碼,雖然這樣有點脫褲子放屁的感覺。
===================引 用 Jiaga 文 章===================
我自已寫了一個 TFrame 裡面放了一個 TChart。
在單獨使用時不管是顯示、產圖都很正常。

但在 TThread 裡面產圖會發生,圖檔不完整,我參考了下列網址說明。
http://www.teechart.net/support/viewtopic.php?f=3&t=7639

在產圖前先 TChart.Draw 到一個 TBitmap 再產圖,但在 Free 物件時會發生 System Error Code 5 拒絕存取。

不進行 TChart.Draw 就不會有這個問題,但就是圖檔不完整。

產圖在 Synchronize 進行就不用 TChart.Draw,產圖也都正常,但不想這樣寫。

想請問有什麼『System Error Code 5 拒絕存取』的處理方式,或注意的地方,謝謝。

Delphi XE 10.1
[code delphi]
procedure TfrmFormulaChart.SaveFormulaChartImage();
var
bmpChart: TBitmap;
wsChartFile: WideString;
begin
bmpChart := TBitmap.Create;
try
bmpChart.Width := self.Width;
bmpChart.Height := self.Height;
chtFormulaChart.Draw(bmpChart.Canvas, Rect(0, 0, bmpChart.Width, bmpChart.Height));
//bmpChart.SaveToFile(psImageFolder psMaxDate '_' psChartName '.bmp');

wsChartFile := psImageFolder psMaxDate '_' psChartName;
if (psImageFormat.CompareTo('PNG') = 0) then
TeeSaveToPNG(chtFormulaChart, wsChartFile '.png')
else if (psImageFormat.CompareTo('JPG') = 0) then
TeeSaveToJPEG(chtFormulaChart, wsChartFile '.jpg', -1, -1)
else if (psImageFormat.CompareTo('BMP') = 0) then
chtFormulaChart.SaveToBitmapFile(wsChartFile '.bmp');

finally
FreeAndNil(bmpChart);
end;
end;
[/code]
fuuk21
一般會員


發表:14
回覆:6
積分:4
註冊:2003-04-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-08-28 09:32:50 IP:114.33.xxx.xxx 未訂閱
在 TfrmFormulaChart 內 建立 一個 FCS: TCriticalSection;
然後 將可能會被存取到的共用資源 用FCS保護起來(依你的描述 至少有 main thread和 你自建的thread 這2個,
共同(可能在同一時間內)使用用這個資源
chtFormulaChart)
編輯記錄
fuuk21 重新編輯於 2017-08-28 10:07:09, 註解 無‧
fuuk21 重新編輯於 2017-08-28 10:08:31, 註解 無‧
fuuk21 重新編輯於 2017-08-28 10:09:48, 註解 無‧
fuuk21 重新編輯於 2017-08-28 11:06:02, 註解 無‧
fuuk21 重新編輯於 2017-08-28 11:07:03, 註解 無‧
fuuk21 重新編輯於 2017-08-28 11:07:52, 註解 無‧
fuuk21 重新編輯於 2017-08-28 11:08:18, 註解 無‧
系統時間:2017-12-12 10:24:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!