怎么确保SendData能够正确发送数据,不会因为SendComplete事件还没有被触发就发送下一条数据而出现冲突
如何确保SendData能够正确发送数据,不会因为SendComplete事件还没有被触发就发送下一条数据而出现冲突?
拜读了“winsock连续发送信息出现错误”([url]http://community.****.net/Expert/topic/5221/5221493.xml?temp=.8030054[/url])之后,使我意识到需要处理连续发送数据的隐患。
我按照jwh2004(兔子)的“设置发送完成标志”的思路,改变了我SendData的机制。可是总是有很多疑问,或者说,我这样改危险性更大。
设置了“发送完成标志”的全局布尔变量 gblFlag,窗体Load的时候设定为 True。
每次 SendData 之前,判断这个变量是不是 True。只有True才可以发送。执行了 SendData 之后,将 gblFlag 设为 False。
如果 SendComplete 事件被触发,说明上一条数据已经成功发送了,再将 gblFlag 设为 True,使得第二条可以正常发送。
方法1:
If myWinSock.State = sckConnected Then
'只有“发送完成的标志”为True时才可以发送新的数据
'当“发送完成的标志”为False,说明调用方的 SendComplete 事件还没有触发。为了保证成功发送,需要反复循环直到成功发送了数据
Do
'执行 SendData 方法将数据发送给远程计算机,会触发对方的 DataArrival 事件
myWinSock.SendData Data:= "Hello "
gblFlag = False
'释放控制权。在释放控制权的期间,调用方的 SendComplete 事件应该被触发,在事件中将 gblFlag 变为 True
For n = 0 To 1000
DoEvents
If gblFlag = True Then Exit For
End If
If gblFlag = True Then Exit Do
Loop Until gblFlag = True
End If
方法2:
If myWinSock.State = sckConnected Then
'只有“发送完成的标志”为True时才可以发送新的数据
'当“发送完成的标志”为False,说明调用方的 SendComplete 事件还没有触发。为了保证成功发送,需要反复循环直到成功发送了数据
For i = 0 To 100
'执行 SendData 方法将数据发送给远程计算机,会触发对方的 DataArrival 事件
myWinSock.SendData Data:= "Hello "
gblFlag = False
'释放控制权。在释放控制权的期间,调用方的 SendComplete 事件应该被触发,在事件中将 gblFlag 变为 True
拜读了“winsock连续发送信息出现错误”([url]http://community.****.net/Expert/topic/5221/5221493.xml?temp=.8030054[/url])之后,使我意识到需要处理连续发送数据的隐患。
我按照jwh2004(兔子)的“设置发送完成标志”的思路,改变了我SendData的机制。可是总是有很多疑问,或者说,我这样改危险性更大。
设置了“发送完成标志”的全局布尔变量 gblFlag,窗体Load的时候设定为 True。
每次 SendData 之前,判断这个变量是不是 True。只有True才可以发送。执行了 SendData 之后,将 gblFlag 设为 False。
如果 SendComplete 事件被触发,说明上一条数据已经成功发送了,再将 gblFlag 设为 True,使得第二条可以正常发送。
方法1:
If myWinSock.State = sckConnected Then
'只有“发送完成的标志”为True时才可以发送新的数据
'当“发送完成的标志”为False,说明调用方的 SendComplete 事件还没有触发。为了保证成功发送,需要反复循环直到成功发送了数据
Do
'执行 SendData 方法将数据发送给远程计算机,会触发对方的 DataArrival 事件
myWinSock.SendData Data:= "Hello "
gblFlag = False
'释放控制权。在释放控制权的期间,调用方的 SendComplete 事件应该被触发,在事件中将 gblFlag 变为 True
For n = 0 To 1000
DoEvents
If gblFlag = True Then Exit For
End If
If gblFlag = True Then Exit Do
Loop Until gblFlag = True
End If
方法2:
If myWinSock.State = sckConnected Then
'只有“发送完成的标志”为True时才可以发送新的数据
'当“发送完成的标志”为False,说明调用方的 SendComplete 事件还没有触发。为了保证成功发送,需要反复循环直到成功发送了数据
For i = 0 To 100
'执行 SendData 方法将数据发送给远程计算机,会触发对方的 DataArrival 事件
myWinSock.SendData Data:= "Hello "
gblFlag = False
'释放控制权。在释放控制权的期间,调用方的 SendComplete 事件应该被触发,在事件中将 gblFlag 变为 True