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

一個3-tier系統lcient端秀出Gauge的問題(急)

答題得分者是:RaynorPao
jhlin88
一般會員


發表:21
回覆:28
積分:9
註冊:2002-10-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-21 14:46:15 IP:211.78.xxx.xxx 未訂閱
各位大哥大姐請教一下: 小弟在三層式的架構中要執行批次過帳的功能, 因為過帳的筆數很大,項秀出進度讓使用者知道 於是想用GAUGE這個元件,過帳的部份是直接呼叫後端(AP_SERVER的一支程式來過帳),這樣的情形下我不能把元件的進度變化寫在後端(因為AP_SERVER和CLIENT機器是分開的),若要寫在前端的話,要如何實作, 另外,我試過用用TIMER來控制GAUGE元件,只是當我在呼叫後端的過帳程式時,畫面會停住不動,當然這個進度也一直停在0,不知道如何解決呢? 接下來我也試著用多緒序的方式來做,在執行的時候,會出現下列一段錯誤訊息 不知道是什麼意思,是不是我哪裡做錯了呢?(目前只知道只要在多緒序-程序裡更改form上面的屬性時,就會錯誤,如gauge1.progress := gauge1.progress 1) 錯誤訊息如下: "0x027c2b68"指令參考的"0x00000378"記憶體。該記憶體不能為read... 另外附上片斷的程式碼:(多緒序的部份在這個procedure下面) procedure TFmFDRCLOSI.btnSureClick(Sender: TObject); var Bookmark: TBookmark; aCDATE : string; aUpdateCLO : TUpdateCLO; begin inherited; Bookmark := cdsFDRSUPMI.GetBookmark; cdsFDRSUPMI.DisableControls; try cdsFDRSUPMI.First; while not cdsFDRSUPMI.Eof do begin If (InfoDBGrid1.RecordChecked[cdsFDRSUPMI.Bookmark] = True) THEN begin aCDATE := GetLDATE(cdsFDRSUPMI.FieldByName('SPNO').AsString, cdsFDRSUPMI.FieldByName('CLOSEDATE').AsString); If aCDATE <> '' then begin try Edit1.TEXT := cdsFDRSUPMI.FieldByName('SPNO').AsString; Edit1.Refresh; Gauge1.Progress := 0; aUpdateCLO := TUpdateCLO.Create(False);//執行多緒序的部份 //以下這四行就是呼叫後端的過帳程式; CallSerVerMethod('sFDRCLOSI', 'AddCLOSI', VarArrayOf([cdsFDRSUPMI.FieldByName('SPNO').AsString, cdsFDRSUPMI.FieldByName('CLOSEDATE').AsString, aCDATE])); Finally aUpdateCLO.Terminate; //終止多緒序 end; end; end; cdsFDRSUPMI.Next; end; finally cdsFDRSUPMI.EnableControls; cdsFDRSUPMI.GotoBookmark(Bookmark); cdsFDRSUPMI.FreeBookmark(Bookmark); end; end; //多緒序的部份 procedure TUpdateCLO.Execute; var I : Integer; begin FmFDRCLOSI.Gauge1.Progress:= FmFDRCLOSI.Gauge1.Progress 1; for I := 1 to 600 do begin Sleep(250); FmFDRCLOSI.Gauge1.Progress:= FmFDRCLOSI.Gauge1.Progress 1; If FmFDRCLOSI.Gauge1.Progress >= FmFDRCLOSI.Gauge1.MaxValue then Break; if terminated then break; end; end; 寫了一大段,只是想讓各位看官知道,小弟是新手,實在是能試的都試了,拜託各位大哥大姐看一下幫幫小弟的忙吧…@@ JamesLin
------
JamesLin
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-21 15:06:00 IP:147.8.xxx.xxx 未訂閱
VCL is not thread safe, try using Synchorize inside the thread.
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-21 15:16:58 IP:203.73.xxx.xxx 未訂閱
引言: 若要寫在前端的話,要如何實作 把你寫的應用程式安裝至client執行 畫面會停住不動,當然這個進度也一直停在0,不知道如何解決呢? 在你的迴圈中加上Application.ProcessMessages
-- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2002/11/21 15:18:29
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-21 15:47:53 IP:203.204.xxx.xxx 未訂閱
引言: 各位大哥大姐請教一下: 小弟在三層式的架構中要執行批次過帳的功能, 因為過帳的筆數很大,項秀出進度讓使用者知道 於是想用GAUGE這個元件,過帳的部份是直接呼叫後端(AP_SERVER的一支程式來過帳),這樣的情形下我不能把元件的進度變化寫在後端(因為AP_SERVER和CLIENT機器是分開的),若要寫在前端的話,要如何實作, 另外,我試過用用TIMER來控制GAUGE元件,只是當我在呼叫後端的過帳程式時,畫面會停住不動,當然這個進度也一直停在0,不知道如何解決呢? 接下來我也試著用多緒序的方式來做,在執行的時候,會出現下列一段錯誤訊息 不知道是什麼意思,是不是我哪裡做錯了呢?(目前只知道只要在多緒序-程序裡更改form上面的屬性時,就會錯誤,如gauge1.progress := gauge1.progress 1)
對三階來說這真的是蠻難的,尤其要秀出正確的進度,用多執行緒來控制就像william所說,要注意VCL is not thread safe,後來我們是改用呼叫自己寫的外部程式來控制,外部程式用Timer到Server取進度。而在執行後端程式時,是整個Lock住的,所以Application.ProcessMessages是沒有作用的。 而用另外一支程式去取進度又是另一個難題,須注意如果用預設方式產生的RDM,每一個DCOMC連進去都是不同的RDM,這時得靠RDM的Name和公用變數來記錄資料。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
jhlin88
一般會員


發表:21
回覆:28
積分:9
註冊:2002-10-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-21 16:25:56 IP:211.78.xxx.xxx 未訂閱
再請問一下: 要如何使用Synchronize在我寫的那段程式裡阿...., JamesLin
------
JamesLin
jhlin88
一般會員


發表:21
回覆:28
積分:9
註冊:2002-10-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-21 17:03:01 IP:211.78.xxx.xxx 未訂閱
用Application.ProcessMessages加在apserver端之後還是不行,鎖住了 這是用eep(三層式架構)來開發的系統,希望各位大大指教一下~~~ 我試了一下多緒序的同步不知道這樣對不對… 將多緒序的部份更改了一下: procedure TUpdateCLO.Execute; begin Synchronize(UpdateGauge); end; procedure TUpdateCLO.UpdateGauge; var I:Integer; begin for I := 1 to 600 do begin Sleep(250); FmFDRCLOSI.Gauge1.Progress:= FmFDRCLOSI.Gauge1.Progress 1; Application.ProcessMessages; If FmFDRCLOSI.Gauge1.Progress >= FmFDRCLOSI.Gauge1.MaxValue then Break; if terminated then break; end; end; 出現另一個錯誤訊息: 不明的應用程式例外,…(一樣) 不知道還有什麼原因呢… JamesLin
------
JamesLin
系統時間:2024-05-05 6:23:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!