说明:我在Activex DLL中有个方法供客户调用,作用是用服务器端的winsokc1连接客户端的winsock1,连接成功后发条消息给客户端的winsock1,客户端的winsock1收到服务器端的消息后,客户端的winsock2连接服务器端的winsock2,然后给他发给成功的消息,到此dll中的方法执行完后,最终把服务器端的两个socket关闭。
   出现的问题:我把dll和测试工程作为工程组一起执行,完全ok,把dll发布com+控件调用时,代码中只用到一个doEvents函数时调用也正常,若用到两个doEvents就会出现问题,个人觉得好像执行时造成冲突了,所以有死锁现象出现。   出现问题的代码:
    Do
        DoEvents
    Loop Until frmTest.wnsAcceptReq.State = sckConnected
   
    frmTest.wnsAcceptReq.SendData "发送给" & sCliIP & "的" & sCliPort & "端口的数据"
    
    '只有收到客户端发过来的成功消息后,才关闭winsock
    Do
        DoEvents
    Loop Until frmTest.acceptMsg = "success"   全部代码如下:
   服务器端:
Option ExplicitPrivate m_ip As String
Private m_port As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Public Function AcceptReq(ByVal sCliIP As String, ByVal sCliPort As Long) As Boolean
    On Error GoTo proccessError
    
    '
    frmTest.winsock1.RemoteHost = sCliIP
    frmTest.winsock1.RemotePort = sCliPort
    frmTest.winsock1.Connect
    
    frmTest.Winsock2.LocalPort = m_port
    frmTest.Winsock2.Listen
    
    Do
        DoEvents
    Loop Until frmTest.wnsAcceptReq.State = sckConnected
   
    frmTest.wnsAcceptReq.SendData "发送给" & sCliIP & "的" & sCliPort & "端口的数据"
    
    '只有收到客户端发过来的成功消息后,才关闭winsock
    Do
        DoEvents
    Loop Until frmTest.acceptMsg = "success"
    
    frmTest.wnsAcceptReq.Close
    frmTest.Winsock2.Close
    Exit Function
proccessError:
    MsgBox Err.Description
End FunctionPrivate Sub Class_Terminate()
    If (frmTest.wnsAcceptReq.State <> sckClosed) Then
        frmTest.wnsAcceptReq.Close
    End If
    If (frmTest.Winsock2.State <> sckClosed) Then
        frmTest.Winsock2.Close
    End If
    
End SubPublic Sub init(ByVal ip As String, port As Long)
    m_ip = ip
    m_port = port
End Sub客户端代码:
Option Explicit
Dim obj As ObjectPrivate Sub Command1_Click()
    
    Set obj = CreateObject("ActivexDLL.TestActivexDLL", "192.168.88.170")
    If (Winsock1.State <> sckClosed) Then
        Winsock1.Close
    End If
    If (Winsock2.State <> sckClosed) Then
        Winsock2.Close
    End If    Winsock1.LocalPort = 4500
    Winsock1.Listen    obj.init "192.168.88.170", 4602
    obj.AcceptReq "192.168.88.170", 4500
End SubPrivate Sub Form_Unload(Cancel As Integer)
    If (Winsock1.State <> sckClosed) Then
        Winsock1.Close
    End If
    If (Winsock2.State <> sckClosed) Then
        Winsock2.Close
    End If
    Set obj = Nothing
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    MsgBox "有连接请求"
    If (Winsock1.State <> sckClosed) Then
        Winsock1.Close
    End If
    Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim data As String
    Winsock1.GetData data, vbString
    MsgBox data
    
    '收到消息后,给服务器端发成功消息
    sendSuccess
End SubPrivate Sub sendSuccess()
    Winsock2.RemoteHost = "192.168.88.170"
    Winsock2.RemotePort = 4602
    Winsock2.Connect
    Do
        DoEvents
    Loop Until Winsock2.State = sckConnected
    Winsock2.SendData "success"
End Sub

解决方案 »

  1.   

    daisy8675(莫依),兄弟,可以把解决方法和思想告诉我一下吗?麻烦你帮一下忙。
      

  2.   

    前天找了很久找不到這張貼,我當時做的DoEvents是嵌套的。不是你並行的。我征求了寶寶的意見,我們的意見大概就是問題不是出在DoEvents上面,而是出現在
    Do
            DoEvents
        Loop Until
    這個循環中間,還是一個條件不滿足。就象我曾經在數據庫中間用for..next刪除數據會全部刪除,do...loop 確剩下一筆,原因就是條件沒有滿足,當時候看著條件滿足,但是還是沒有滿足,所以還是條在裡面沒有離開了我這個也隻是個人看法,可能是錯的