如何可以不讓SQL漏斗出現 |
答題得分者是:malanlk
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
其實,想在使用在Timer每秒更新資料時用,已經試過就算有SQL漏斗出現,也可click其他地方,
但可能只是因為更新時間不長,如果長的話可能也不可click其他地方。 因為每秒都更新,所以才不想SQL漏斗出現。 ===================引 用 malanlk 文 章=================== 既然是要暗中花時間處理,那就另外起一個 thread 來處理,處理完再傳個 Message 請主執行緒更新資料。
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
不好意思,還未使用過thread ,所以要找找資料再看看行不行,或許有沒有簡單的範例?
===================引 用 malanlk 文 章=================== 另外起一個 thread 和使用 Timer 是不一樣的,Timer的執行緒主程式的執行緒,所以你還是會看到漏斗,如果你弄一個 thread 內有可中斷的迴圈,每 Sleep(1000) 就去更新資料.. 這樣應該是不會看到漏斗的.
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
關於 Thread 的使用應該有範例程式
用thread 自動更新的架構大致如下 procedure TUpdateThread.Execute; begin [Create & Connect DB] try while not terminated do begin [Update Your Data] sleep(1000); end; finally [Free DB Connect] end; end; 要停掉 Thread 就呼叫 YourThread.Terminate 即可
編輯記錄
malanlk 重新編輯於 2008-03-12 16:18:27, 註解 無‧
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
謝謝範例~
還想問問當 [Update Your Data]時,應該還是要用上SQL update,那麼SQL 漏斗不是還會出現嗎?小弟在這個地方不是太明白,所以麻煩略略說明一下~ ===================引 用 malanlk 文 章=================== 關於 Thread 的使用應該有範例程式 用thread 自動更新的架構大致如下 procedure TUpdateThread.Execute; begin [Create & Connect DB] try while not terminated do begin [Update Your Data] sleep(1000); end; finally [Free DB Connect] end; end; 要停掉 Thread 就呼叫 YpurThread.Terminate 即可
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
是用DBE的,現在都是測試階段CODE很簡單
============================= 使用這個方式換新資料是想用于病人排隊看病上~當醫生看完一個病人,按software上”NEXT”鍵後, 會更新在外面的登記人員用的SCREEN上的排隊資料,所以登記那邊要不停監測database的變化。 可能想多了,只用TTABLE也許可以實現功能。 // 在另一個Form的oncreate 中的code MyupdateThread:=UpdateThread.Create(false); //thread code procedure UpdateThread.Execute; var i:integer; begin { Place thread code here } i:=0; while (1=1) do begin sleep(100); Pati_Rec_Maker.act_Q1.close; Pati_Rec_Maker.act_Q1.open;//更新資料act_Q1是Tquery i:=i 1; Pati_Rec_Maker.Memo1.Text:=Pati_Rec_Maker.Memo1.text #13#10 'working thread ' inttostr(i);//只是用来觀察thread的變化。 end; end;
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
幾個建議....
1. 在 Thread 中呼叫了其他 Form 裡的 VCL 元件,在 Delphi 的 Thread 元件中如果要處理其他 Form中的元件就要用 Synchronize 機制來和主執行緒做同步以免導致 VCL 元件問題 (not thread safe),關於 Synchronize Delphi 的 Help 說明很清楚。 2. 你的監控資料異動方式會造成網路不必要的負荷,你應該建立一個 TCP Server 負責和各 Screen 及 醫師的Terminal 溝通,當醫生按下 Next 後,醫師端的 TCP Client 就會傳訊息給 TCP Server 說 "Doctor X 看完 病人 Y",Server 收到後就對所有監看 Doctor X 的 Screen 發出更新資料的訊息。 關於 TCP C/S, KTOP 上有許多這方面的討論。 3. DBE 是 dbExpress? 還是 BDE 的誤寫? 要單機不花錢 可以用 mySQL 來試試 或是用 SQL Server Express 也可以 4. 如果只是查詢資料,盡量不要用 TTable不然很容易碰到 Lock 的問題。 5. 如果不想要出現 漏斗 那就不要用 DBGrid 而是直接用 StringGrid 來承接,再不然100 msec 的時間間隔可以改成 1 秒.. 說老實話就算設成 2 秒的 Delay 對在病房外的排隊的人及醫師也是感覺不到的... 醫師看完一個病人 打個哈欠, 甩甩手就不只 2 秒了.... |
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
謝謝建議:~
建議:~ 1。我都不想用,這是一個很懶的方法,用它的原因是不識建議(2),又覺得建議(2)的方法好像很複雜。 2。其實,之前也都問過這裡的先進們關於 TCP C/S,但都是叫我在KTOP找找資料,可是資料太雜亂了, 對一個新手來說有點困難,請問有沒有教學網址或是書本介紹?或許可不可以提供簡單範例? 3。對不起,絕對是手誤。現在小弟是用MYSQL練功的。 4。想請教Lock 的問題,即是什麼問題呢? 5。好像不似是msec 的時間間隔問題,它的樣子似是畫DBGRID做到一半就停了,QUERY也是close的。 謝謝先進回覆小弟,可能還有請教機會,謝謝指點~ ===================引 用 malanlk 文 章=================== 幾個建議.... 1. 在 Thread 中呼叫了其他 Form 裡的 VCL 元件,在 Delphi 的 Thread 元件中如果要處理其他 Form中的元件就要用 Synchronize 機制來和主執行緒做同步以免導致 VCL 元件問題 (not thread safe),關於 Synchronize Delphi 的 Help 說明很清楚。 2. 你的監控資料異動方式會造成網路不必要的負荷,你應該建立一個 TCP Server 負責和各 Screen 及 醫師的Terminal 溝通,當醫生按下 Next 後,醫師端的 TCP Client 就會傳訊息給 TCP Server 說 "Doctor X 看完 病人 Y",Server 收到後就對所有監看 Doctor X 的 Screen 發出更新資料的訊息。 關於 TCP C/S, KTOP 上有許多這方面的討論。 3. DBE 是 dbExpress? 還是 BDE 的誤寫? 要單機不花錢 可以用 mySQL 來試試 或是用 SQL Server Express 也可以 4. 如果只是查詢資料,盡量不要用 TTable不然很容易碰到 Lock 的問題。 5. 如果不想要出現 漏斗 那就不要用 DBGrid 而是直接用 StringGrid 來承接,再不然100 msec 的時間間隔可以改成 1 秒.. 說老實話就算設成 2 秒的 Delay 對在病房外的排隊的人及醫師也是感覺不到的... 醫師看完一個病人 打個哈欠, 甩甩手就不只 2 秒了....
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
1. 因為絕大多數的 VCL 元件(包括 DBTable, DBGrid) 都不是 thread safe 的, "它的樣子似是畫DBGRID做到一半就停了,QUERY也是close的" 看起來就是沒有 Synchronize 造成的。不是懶不懶,而是你非這樣用不可...
2. Indy 本身也有 Demo 程式 http://www.indyproject.org/Sockets/Demos/index.EN.aspx 3. MySQL 不錯用. 不過 Delphi 提供的 dbExpress driver 好像有 bug,我是用 http://www.microolap.com/products/connectivity/mysqldac/ 這元件,穩定性不錯。 4. 既然你已經知道 thread 你可以開兩個 thread 裡面用 TTable 來 異動資料.. 你就會知道什麼是 Lock 了 5. 我覺得 100 msec 改成 1000 msec 或 2000 msec 才更新,排隊的人是不會感覺到的,卻可以減少網路負荷到 1/10 1/20。 |
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
Delphi 提供的 Mysql dbExpress driver 不是有 bug,而是簡直用不到。小弟試過用另一個收費版,卻無事,但有時限。
開兩個 thread 裡面用 TTable 來 異動資料,是 異動資料同一個TTable嗎? ===================引 用 malanlk 文 章=================== 1. 因為絕大多數的 VCL 元件(包括 DBTable, DBGrid) 都不是 thread safe 的, "它的樣子似是畫DBGRID做到一半就停了,QUERY也是close的" 看起來就是沒有 Synchronize 造成的。不是懶不懶,而是你非這樣用不可... 2. Indy 本身也有 Demo 程式 http://www.indyproject.org/Sockets/Demos/index.EN.aspx 3. MySQL 不錯用. 不過 Delphi 提供的 dbExpress driver 好像有 bug,我是用 http://www.microolap.com/products/connectivity/mysqldac/ 這元件,穩定性不錯。 4. 既然你已經知道 thread 你可以開兩個 thread 裡面用 TTable 來 異動資料.. 你就會知道什麼是 Lock 了 5. 我覺得 100 msec 改成 1000 msec 或 2000 msec 才更新,排隊的人是不會感覺到的,卻可以減少網路負荷到 1/10 1/20。
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
但如果用上cached update 呢?會不會LOCK? ===================引 用 malanlk 文 章=================== Delphi 提供的 Mysql dbExpress driver 不是有 bug,而是簡直用不到。小弟試過用另一個收費版,卻無事,但有時限。 好用就好 開兩個 thread 裡面用 TTable 來 異動資料,是 異動資料同一個TTable嗎? 當然是啦 不然有啥好 Lock 的!
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |