С контролем mscomm существует та же проблема.Работать с асинхронными событиями всегда сложно.
Во-первых, мой личный способ справиться с этим, вероятно, существует иным способом.так что это еще один вариант.
Я сталкивался с этой проблемой более одного раза, и часто я забываю, как справиться с этим.так что это также будет моей личной ссылкой
Сначала идея
create time of expiration when it became to be reached
the information should be complete
ну, нам нужно понять, как происходят события
Графическое представление, которое будет мертвым временем, мертвым временемпросто это период времени
Теперь в vb6, когда происходят асинхронные события, также должны происходить два действия в разные моменты времени, но они проверяются в один и тот же момент
Action #1 that action update the current time
Actions #2 that is limited to update the time current time for async event
Both event are combined on one infinity loop method
the purpose is check current time against the current time of async event
Также нам понадобится некоторая утилита для отслеживания времени, когда я использовал выигрышapi GetTickCount
В mscomm нам также понадобится добавить флаг и строку, чтобы знать, если кто-то получил его, так что не нужно так долго ждать вызова интерфейса к порту
Также этот код может вызвать событие itдля повторного использования и изоляции
теперь посмотрите скелет класса vb6
class Module SocketReceptorVb6
Private Declare Function GetTickCount Lib "kernel32" () As Long ' API tick
withevents _tcpControll as Winsock
private m_currentState As Eventstate 'is a enumerate Waiting, Receiving
private m_currentTimeAsynEvent As Long ' current time for async event
private m_buffer As String
private m_timeOut as Long
Public Event StreamReceived(ByVal stream As String) 'Event completed
Property TimeOut
private sub Class_Initialize()
m_currentState = Waiting
end sub
sub tcpControl_DataArrival(bytesTotal)
sub Receiving
sub InitFlags
End Class
хорошо, теперь давайте посмотрим на 3 метода более внимательно
InitFlags Method
Это очищает переменные и подготавливаетambient, смотрите содержание
m_currentState = Waiting //state of the process
m_buffer = vbNullString //reset the buffer used for the information
tcpControl_DataArrival Method
Этот методиметь следующие обязанности
-update buffer
-initialize infinity loop
-update m_currentTimeAsynEvent
содержание метода
Dim sBuff As String
wskConnect.GetData sBuff, vbString
m_buffer = m_buffer & sBuff
' update time for Asyn Event
m_currentTimeAsynEvent = GetTickCount()
if m_currentState = Waiting then
m_currentState = Receiving
InfinityLoop()
end if
InfinityLoop Method
verify that the expiration time has been reached
Content method
Dim current_time As Long ' the time point o current time
Do
current_time = GetTickCount()
' timeout reach, exit of loop
If current_time > m_currentTimeAsynEvent + m_timeOut Then
Exit Do
End If
DoEvents
Loop
RaiseEvent StreamReceived(m_buffer)
InitFlags 'Reset flags and variables
Примечание: , чтоожидаемый код с одним потоком, а не с несколькими ответами сокетов