我有一個問題是資料視窗中設定了3個欄位分別是數量、單價、金額。正常情況應該是 金額=數量x單價。但是偶爾會發生 金額<>數量x單價 (這個錯誤不是數值精度的原因造成的,是完完全全的錯誤)。我排查了很多遍仍不能確定程式代碼哪里有錯。正在我準備放棄的時候發現 在保存前有個post事件是用來計算金額的。我印象中post事件的觸發時間是不能確定的。有沒有可能當資料視窗已經update之后系統才觸發了post事件的計算程序。
我就是想知道上述我說的這個問題是不是可能存在的。
uj5u.com熱心網友回復:
能把代碼貼上來看看嗎?uj5u.com熱心網友回復:
如果呼叫異步觸發事件,在一段代碼中,回先把非異步呼叫的事件或函式執行結束,然后再回頭觸發異步呼叫的事件或函式,就是異步呼叫默認被放到當前執行代碼的最后uj5u.com熱心網友回復:
保存的程序嵌套了N多個事件,沒法全都貼出來。我只能大致舉個例子。//以下是點擊保存按鈕的程序
dw_1.post setitem( "a" , ldc_temp )
……
……
dw_1.update()
當然實際代碼嵌套的非常復雜,我就沒法全都列出來了。如果是類似這么段代碼會不會造成欄位a的資料在保存之前沒有寫入?
uj5u.com熱心網友回復:
我這個post事件是被嵌套在保存事件中的其中某一個事件(比如說是事件a)之中,那么請問這個post事件最晚會在什么時候被呼叫?
問題補充:這個post事件最晚是會在事件a之后馬上呼叫,還是也有可能在保存事件結束之后才被呼叫?
uj5u.com熱心網友回復:
像你舉的這個例子我覺得,那個set的代碼會在update之后執行。post是將訊息重新在window訊息佇列中排列的意思,就是滯后排列,滯的是當前事件之后。uj5u.com熱心網友回復:
由于我這個post事件是被嵌套在保存事件中的其中某一個事件(比如說是事件a)之中,那么請問這個post事件最晚會在什么時候被呼叫?
問題補充:這個post事件最晚是會在事件a之后馬上呼叫,還是也有可能在保存事件結束之后才被呼叫? 我測驗過很多次,每次測驗post setitem事件都是在update之前就被呼叫了。但是由于post事件我不確定最晚會被呼叫的時間所以還希望問問清楚,我程式設計上是不是有問題
uj5u.com熱心網友回復:
首先,我想說,沒什么絕對必要,是不需要加入post來引起大腦混亂的。常規做法,不會在事件中嵌套post,我是建議你將post全部去掉,除非你有必要的需求,那你可以說出來,大家幫你看看是否有必要加入post。windows訊息佇列的東西,誰也說不準到底怎么執行,我們不是搞作業系統的,不知道哪個執行緒什么時候能執行,這些都是cpu說了算的。uj5u.com熱心網友回復:
另外,你可以參考這個貼看看我的回復。http://bbs.csdn.net/topics/390059325
uj5u.com熱心網友回復:
舉個簡單的 例子
funciton wf_3()
(
sle_1.text = 'wf_3'
sle_1.postevent('ue_test')
wf_2()
)
wf_2()
(
sle_1.text = 'wf_2'
function post wf_1()
return 1
)
這樣在 執行 wf_3()時,是
把sle_1的事件先放最后,執行wf_2(),
在執行wf_2()時由于wf_1()是異步觸發又放到最后
這樣wf_3執行完以后,開始執行事件ue_test,然后再執行wf_1()
uj5u.com熱心網友回復:
由于一直沒有上線回復晚了,不好意思,post的意思就是把要異步執行的事件或函式放到整體函式體或事件體的最后,在執行完這個函式體或事件體以后再回傳來依次執行被post的物件,所有經過post的相當于是一個佇列,先放進去的先執行。/以下是點擊保存按鈕的程序
dw_1.post setitem( "a" , ldc_temp )
……
……
dw_1.update()
你這樣寫會先update,最后才設定 欄位的值,所以問題會很大的
uj5u.com熱心網友回復:
說點題外話,在我的認識里,好像pb從來都是單執行緒的,當然,如果你就是另類,搞出個外部函式,弄出個新執行緒來,我也不奇怪,因為,我也曾經嘗試過用c++做一個外部動態庫,目的就是創建一個新執行緒,單獨彈出一個視窗。所想達到的目的是讓這個視窗能顯示一個可以動的gif圖片(比如一個進度條)。因為,如果你在單執行緒的pb中進行高負荷預算的時候,是無法做到同時還能顯示影片的,只能看到一個靜止的圖片。所以,從中我得出的結論是pb也不可能實作什么異步,代碼僅僅用post改變執行順序,這可不叫異步!可能我說這些有些習題大作了,但我還是希望在技術領域能相對嚴謹一些,如果我說的不對,還請大俠們提點一二,小弟不勝感激。uj5u.com熱心網友回復:
先說樓主的問題,你的這種寫法肯定是先update后再執行post的方法,不明白為什么你這么寫。post的特點就是把要呼叫的事件或方法放到當前代碼所在的事件或方法之后去執行,至于你說的有時候行有時候不行,可能是你不小心點了再次update呢?第二次update恰好保存了第一次的post,所以行的時候才是不正常的。至于11樓說的pb多執行緒的問題,post的確只是改變執行順序,而沒有再開一個行程,這個真不叫異步,但實際上pb也可以實作類似的多執行緒,我一般是利用開一個或多個隱藏的視窗,或是openuserobject多個用戶控制元件,打開他們的timer事件,基本上timer事件里的代碼會以多執行緒的形式來運行的,您可以試一下。至于你說的那個只能看到一個靜止的圖片的問題,就算是使用C++來寫,如果要求的系統資源比較高,它可能也會這樣(當然機率比較小,C#出現的機率會稍比它大),只不過pb來處理的話,出這個問題的可能性會更大而已。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/55568.html
標籤:基礎類
上一篇:直接向USB口發送指令的問題
下一篇:資料視窗列Edit屬性選擇radiobutton風格,但是底下的columns across以及code table中如何動態賦值
