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

如何可以不讓SQL漏斗出現

答題得分者是:malanlk
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-01 00:35:36 IP:218.254.xxx.xxx 訂閱
因為不想讓USER知道正在使用SQL處理資料,而且出現漏斗時又
不能使用其他功能,可否不讓SQL漏斗出現,而且又可以讓USER繼續使用
其他功能呢?
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-01 02:39:19 IP:61.219.xxx.xxx 訂閱
既然是要暗中花時間處理,那就另外起一個 thread 來處理,處理完再傳個 Message 請主執行緒更新資料。
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-01 11:28:36 IP:218.254.xxx.xxx 訂閱
其實,想在使用在Timer每秒更新資料時用,已經試過就算有SQL漏斗出現,也可click其他地方,
但可能只是因為更新時間不長,如果長的話可能也不可click其他地方。
因為每秒都更新,所以才不想SQL漏斗出現。
===================引 用 malanlk 文 章===================
既然是要暗中花時間處理,那就另外起一個 thread 來處理,處理完再傳個 Message 請主執行緒更新資料。


------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-01 15:22:37 IP:61.219.xxx.xxx 訂閱
另外起一個 thread 和使用 Timer 是不一樣的,Timer所在的執行緒就是主程式的執行緒,所以你還是會看到漏斗,如果你弄一個 thread 內有可中斷的迴圈,每 Sleep(1000) 就去更新資料.. 這樣應該是不會看到漏斗的.
編輯記錄
malanlk 重新編輯於 2008-03-02 02:40:15, 註解 無‧
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-01 21:13:33 IP:218.254.xxx.xxx 訂閱
不好意思,還未使用過thread ,所以要找找資料再看看行不行,或許有沒有簡單的範例?

===================引 用 malanlk 文 章===================
另外起一個 thread 和使用 Timer 是不一樣的,Timer的執行緒主程式的執行緒,所以你還是會看到漏斗,如果你弄一個 thread 內有可中斷的迴圈,每 Sleep(1000) 就去更新資料.. 這樣應該是不會看到漏斗的.
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-02 02:53:12 IP:61.219.xxx.xxx 訂閱
關於 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-03-02 10:25:31 IP:218.254.xxx.xxx 訂閱
謝謝範例~
還想問問當 [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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-03-02 15:14:26 IP:61.219.xxx.xxx 訂閱
因為單純的 thread 並不處理視窗訊息, 所以Thread裡的TADOConnection對Cursor 的設定是無法傳遞的。
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-03-03 15:03:13 IP:218.254.xxx.xxx 訂閱
THX~let me try it~
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
編輯記錄
chkkevin 重新編輯於 2008-03-03 15:03:33, 註解 無‧
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-03-12 14:53:59 IP:218.254.xxx.xxx 訂閱
多謝先進指點:~
已經測試了果然,不會出現SQL斗漏,但另一個問題出現了,
在thread.execute中用close, open來更新資料時,DBGrid的
column大小竟然會時大時小,不知道問題在那裡呢?
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-03-12 16:59:47 IP:218.211.xxx.xxx 訂閱
    您是用 ADO 嗎? 方便將程式貼上來嗎?
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-03-13 15:48:55 IP:218.254.xxx.xxx 訂閱
是用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;
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
編輯記錄
chkkevin 重新編輯於 2008-03-13 15:53:45, 註解 無‧
chkkevin 重新編輯於 2008-03-13 15:55:15, 註解 無‧
chkkevin 重新編輯於 2008-03-13 16:07:58, 註解 無‧
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-03-13 18:48:45 IP:218.211.xxx.xxx 訂閱
幾個建議....
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-03-14 00:08:22 IP:218.254.xxx.xxx 訂閱
謝謝建議:~
建議:~
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-03-14 01:59:12 IP:61.219.xxx.xxx 訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-03-14 03:18:00 IP:218.254.xxx.xxx 訂閱
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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-03-14 09:27:24 IP:218.211.xxx.xxx 訂閱

===================引 用 chkkevin 文 章===================
Delphi 提供的 Mysql dbExpress driver 不是有 bug,而是簡直用不到。小弟試過用另一個收費版,卻無事,但有時限。
好用就好

開兩個 thread 裡面用 TTable 來 異動資料,是 異動資料同一個TTable嗎?
當然是啦 不然有啥好 Lock 的!

chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#18 引用回覆 回覆 發表時間:2008-03-14 12:36:23 IP:218.254.xxx.xxx 訂閱

但如果用上cached update 呢?會不會LOCK?
===================引 用 malanlk 文 章===================
Delphi 提供的 Mysql dbExpress driver 不是有 bug,而是簡直用不到。小弟試過用另一個收費版,卻無事,但有時限。
好用就好

開兩個 thread 裡面用 TTable 來 異動資料,是 異動資料同一個TTable嗎?
當然是啦 不然有啥好 Lock 的!
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#19 引用回覆 回覆 發表時間:2008-03-14 15:27:11 IP:218.211.xxx.xxx 訂閱
連線參數設好就不會

===================引 用 chkkevin 文 章===================

但如果用上cached update 呢?會不會LOCK?
系統時間:2024-05-16 19:07:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!