星期日, 5月 14, 2006

PowerBuilder 9 的非同步呼叫

同事在問pb9能不能做到call sp時,畫面的progress bar也給跑一下,不然還以為當掉了呢.這個問題,回想起來,在pb6時,就好像沒有sp呼叫時asynchronous的功能,於是就在畫面上show個正在處理中的static text,只不過整個handle都被帶走了,user只能等等等,等sp結束傳回值來.
也好長一段時間沒看pb,我的knowledeg都只停留在pb6,所以花了一些時間在sybase forums上找了一下,發現好像可以做,回頭再看了一下pb help,照著上面的step做了一遍,就是失敗加失敗.惱了一會後,拜google之賜,看到了一個可能的解法,再回去測了一下,嘿嘿,竟然給做到了,看來pb要加把勁了,寫了一個不work的sample help.
我簡化後的步驟如下,
1. 先建二個non visual object,分別為nvo_callback 及nvo_send
2.宣告nvo_send為instance variable, 在這只要先宣告一個就好,不要參考help上的做法
nvo_send invo_send
3. 在原本呼叫sp的event或function中取取得nvo_send reference,
SharedObjectRegister( "nvo_send", "myshare" )
SharedObjectGet( "myshare", invo_send )
4. 在 nvo_send 中自訂一個user evnet, 例如 ue_send ,帶不帶參數都可以,看需要囉,要注意,這里只能帶non visual的型態參數.
5. 在nvo_callback自訂一個user event, 例ue_callback, 將sp的呼叫寫到這個event中
記得,最好在這個event中,自訂一個sp專屬的transaction object,
Transaction ltr_callback
ltr_callback = CREATE Transaction
DECLARE proc_name PROCEDURE FOR sp_proceduer USING ltr_callback;
Execute proc_name ;
FETCH proc_name INTO :ll_return ;
CLOSE proc_name;
.....
6. 在nvo_send ue_send event 中,
nvo_callback lnvo_calback
lnvo_calback = CREATE nvo_callback
lnvo_calback.Post Event ue_callback ( as_sender, as_logtime ) 
 用trigger event或post event 好像都可
結論是, step 3的二個動作,一旦取得了reference後, 就可以做到非同步的呼叫了,
和help sample不同的是, 要在ue_send 才宣告nvo_callback, 這是在newsgroup找答案時得到的靈感.

2 則留言:

rogerroan 提到...

為何不將Execute proc_name放在nvo_send.ue_send()
直接在主執行緒中 nvo_send.post ue_send() ?

rogerroan 提到...
作者已經移除這則留言。

實在不會也不能做人

在親人面前、在同事面前、在客戶面前,八面玲瓏,說得體話,做得體事對我來說真的好難。 最近有種被打趴的感覺 ,因為身心靈都生病了。 11月初確診出關咳了二個多月都跨年咳了,怎麼我還沒咳血? 在公司有同事,在家有親戚,在工作地有客戶,好想𥁞情的咳,但礙於異樣的眼光(多半是自已的疑神...