首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

怎么确保SendData能够正确发送数据,不会因为SendComplete事件还没有被触发就发送下一条数据而出现冲突

2012-03-23 
如何确保SendData能够正确发送数据,不会因为SendComplete事件还没有被触发就发送下一条数据而出现冲突?拜

如何确保SendData能够正确发送数据,不会因为SendComplete事件还没有被触发就发送下一条数据而出现冲突?
拜读了“winsock连续发送信息出现错误”([url]http://community.csdn.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


                        For   n   =   0   To   1000
                                DoEvents
                                If   gblFlag   =   True   Then   Exit   For
                        End   If

                        If   gblFlag   =   True   Then   Exit   For
                Next
        End   If


问题:jwh2004(兔子)大侠推荐在事件的代码中不要   DoEvents   ,否则会事件重入,程序发生混乱。我同感。
            可是如果不用   DoEvents,程序怎么能够脱身去触发   SendComplete   事件呢?我需要经常性地在   DataArrival   事件中发送数据。

            以上的两个方法,我担心一次   DoEvents   恐怕来不及触发调用方的   SendComplete   事件,循环了1千次。
            可是如果因为什么原因,调用方的   SendComplete   事件没有被触发,我的方法1岂不成了死循环?方法2在耗费了大量的CPU资源(循环了10万次)之后还是没有将   gblFlag   变为   True,没有成功发送。
            另外我有点胡涂了,我这两个方法,不会把同样的数据发送多次吧?


[解决办法]
winsock.senddate 数据 & "s#@$@#$@#%@% "
接收的时
dim str as string
winsock1(index).getdate str
dim tempre() as string
tempre=split(str, "s#@$@#$@#%@% ")
dim i as long
for i=0 to ubound(tempre)
调用分拣消息方法(tempre(i))
next

热点排行