我的程式經常幾乎在同一時間觸發多個事件,而這些事件呼叫的程序要訪問同一個陣列,如何避免兩段程序同時修改陣列導致錯誤覆寫掉之前的資料?我本來設想做一個標記,當一段程序訪問陣列前查看標記,如果標記表示沒有別的程序訪問陣列,就先改寫標記,再訪問陣列。但是也會出現這個程序查看標記沒問題后,正要改寫標記之前卻被另一個程序來檢查標記,導致兩個程序都以為自己可以訪問陣列,還是會導致訪問沖突。
uj5u.com熱心網友回復:
你使用了多執行緒?vb6程式通常情況下,在某個時刻只能處理一件事。
uj5u.com熱心網友回復:
不知道啊,我用winsock控制元件,當有多個連接遇到dataArivel(可能拼錯)事件時?程式會對這些事件采用多執行緒來處理嗎?
uj5u.com熱心網友回復:
資料包到達先后的問題,你資料包里需要加上可以區分順序的標記uj5u.com熱心網友回復:
winsock包含多執行緒------我猜的
。一般情況:
1、tcp模式下,不需要自己分包發送,winsock會自動根據當前網路情況分包發送,在接收端只需要將接收到的位元組陣列按順序拼接就可以;
2、如果是分塊并使用多個winsock來發送的話,就需要自己處理各個塊的順序問題。多對winsock之間的發送順序和接收順序可能有差別。
uj5u.com熱心網友回復:
猜的啊。那我還是自己測驗下。
uj5u.com熱心網友回復:
@bakw 那么收發的資料要不要自己做個校驗,防止tcp通信個別bit被反置了,還是說tcp通信本身就能防止這種錯誤?
uj5u.com熱心網友回復:
用多個winsock接收多個連接請求,就不能用一個陣列啊。你把陣列定義到一個類中,然后創建一個winsock的同時也創建一個類實體,不就每個winsock就有一個自己的陣列了。
uj5u.com熱心網友回復:
一般TCP通訊自帶了校驗的,不需要自己外加,但是資料包長度是在1.5K以下的,發送和接收順序可能會不一致,所以如果是多包資料,需要確定包的序號uj5u.com熱心網友回復:
僅供參考:Private Sub SendCICMsg(tn As Integer, s As String) 'lineA...
Dim after As Double
On Error Resume Next
after = Now + 15# / 24# / 3600#
Do
DoEvents
If CICsending = -1 Then
CICsending = tn
If CICsending = tn Then
CICstr = s
TimerCICsend.Enabled = True
Exit Do
End If
End If
If Now > after Then
LogErrMsg "SendCICMsg " + CStr(tn) + "," + s + " 15s overtime!"
CICsending = -1
Exit Do
End If
Loop
End Sub
uj5u.com熱心網友回復:
@bakw 我舉個例子,用winsock控制元件向web服務器發起一個下載1M大的檔案的請求,那服務器不一定會幫你把每個包都標好順序的吧?難道winsock控制元件不保證每個資料包的順序?uj5u.com熱心網友回復:
具體不是很清楚,記得用以前winsock下載web資料接收效果很糟糕,后來我改用winhttp來下載,省心得多。
uj5u.com熱心網友回復:
和協議(Protocol屬性)有關,TCP是有序的,UDP是無序的。uj5u.com熱心網友回復:
別討論了,在9樓我已經給出標準答案了。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/96699.html
標籤:VB基礎類
