powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вот такой код...., работает только пополам
16 сообщений из 16, страница 1 из 1
Вот такой код...., работает только пополам
    #32243307
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу показать пример кода, с которым я мучуюсь уже 4 день. Может кто подскажет где искать причину глюков( или еще что хорошее посоветует).
И хоть код относится к программированию на контрл. Winsock (что не всем может близко знакомо), но странности в работе/не работе этого куска кода можно рассматривать несколько абстрактно...

Смысл проблемы (если отбросить все лишнее) вот в чем.
Такой кусок кода не работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Sub Кнопка1_Click()

  WinsockCom.Close
  WinsockCom.RemotePort =  21   ' порт FTP
  WinsockCom.RemoteHost = FromHost ' адрес FTP-сервера  
  WinsockCom.Connect ' подсоединение к FTP

  Wait(2000)
  If WinsockCom.State=7 Then
    sSendData = "USER " & sUser & vbCrLf
    WinsockCom.SendData sSendData
  End If
End Sub

Public Sub Wait(lEndTime as Long)
  Dim lTime as Long
  lTime = timeGetTime ' Win API функция
  Do
    DoEvents
  Loop Until timeGetTime - lTime >  2000 
End Sub


Смотрим за приходящими данными в событии DataArrival, выводим через Debug.Print. После Connect, приходит ответ об успешном подсоед. - 220 Serv-U FTP Server v3.0 for WinSock ready..., а вот дальше, посылай хоть тысячу разных команд (через разные паузы и т.д.), одно молчание.

НО, стоит этот код разделить на две части, разместить на двух кнопках и последовательно их нажать(можно даже очень быстро), как все работает, чудеса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub Кнопка1_Click()
  WinsockCom.Close
  WinsockCom.RemotePort =  21   ' порт FTP
  WinsockCom.RemoteHost = FromHost ' адрес FTP-сервера  
  WinsockCom.Connect ' подсоединение к FTP
End Sub

Private Sub Кнопка2_Click()
  If WinsockCom.State= 7  Then
    sSendData =  "USER "  & sUser & vbCrLf
    WinsockCom.SendData sSendData
  End If
End Sub


Не могу понять почему так происходит. Причем после первого (не работ.) варианта, Aссess через некоторое время начинает сильно тормозить и приходится его потом 3 кнопками, вроде WinsockCom.Close всегда в конце делаю, вообще незнаю что и думать, чертовщина какая-то, а во всех справках так красиво написано, посылаешь, примаешь а тут такая петрушка... :-(
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243315
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Предлагаю поставить DoEvents в том месте, где требуется пауза.
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243322
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч ты не внимателен.
посмотри на функцию Wait еще раз.
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243332
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять причины не работы кода вместе, но работы его с разделением...
А если так попробовать - в первом коде после коннекта программно вызывать код под второй кнопкой - если будет работать, то оформить функцию.
Но не понятно, почему так происходит....
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243465
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я невнимателен, прошу прощения.
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243485
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Не могу понять причины не работы кода вместе, но работы его с разделением...
А если так попробовать - в первом коде после коннекта программно вызывать код под второй кнопкой - если будет работать, то оформить функцию.
Но не понятно, почему так происходит....


Прикол, так заработало.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Кнопка1_Click()

  WinsockCom.Close
  WinsockCom.RemotePort =  21   ' порт FTP
  WinsockCom.RemoteHost = FromHost ' адрес FTP-сервера  
  WinsockCom.Connect ' подсоединение к FTP

  Wait( 2000 )
  
  Call  Кнопка2_Click

End Sub


Блинн, но в чем же покус фокус.

У себя никто не пробовал повесить на кнопку этот код?
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243498
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не пробовал.
Мысль высказал просто из своих жизненных наблюдений за поведением аксеса, иногда, почему-то, связка нескольких функций стабильно отрабатывает, а если в одну поместить - то нет. Мне показалось, что здесь как раз такой же случай.
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243530
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После перебора различных вариантов, я понял, что весь затык происходит после команды .Connect и почему-то даже несмотря на то, что приходит ответ от сервера об успешном подсоединении и статус winsock=7 (готов значит) ему все-таки требуется какая-то пауза, после которой уже можно направлять следующие команды. При этом пауза через DoEvents или Sleep для него не подходит, а вот после обращения к другой функции/процедуре все ОК.

Что ж такого происходит в компьютере/Access'е, когда он вызывает другую функцию в отличии от такого же кода, следующего прямиком...?
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243550
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergeySV
Не знаю что происходит - повторюсь ещё раз.
Для окончательной проверки глюка можно проделать тоже самое в обычном VB (не разделяя тело на 2 части), если там всё будет работать - значит проблемма только в Аксесе.
Аксес, к примеру, очень плохо работает с ActiveX (плохо не в плане функциональности), а в плане удобства доступа к свойствам объекта из VBA, поэтому приходится иногда писать код в VB, а потом его переносит в Аксес.
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32243597
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, проверю дома на VB6 (можно еще и на VB.net), завтра напишу, что интересного...
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32244576
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докладываю :-)

Под VB6 ocx winsock не встал, конфликт имен (с VB.net компонентами наверное)
Под VB.net коннект был, но при первом приеме данных происходила какая-то ошибка в методе GetData, пока не понял почему, разбираюсь...

Однако дальнейшие эксперименты под Access показали вот что:
Чтобы эти куски кода заработали необходимо их разделить, но засовывание одного из них в функцию не проходит, только если один из кусков засунуть в другую Sub и потом ее вызвать, вот такие вот пироги...
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32244657
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что так работать не будет?
У меня работает (правда в целом посложнее будет, но принцип такой)

WinsockCom.Connect
Do Until WinsockCom.State = 7
DoEvents
Loop
sSendData = "USER " & sUser & vbCrLf
WinsockCom.SendData sSendData
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32245040
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно, этот код у меня тоже заработал нормально.

Ща тестирую, кажется я начал понимать в чем была загвоздка...
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32245154
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, что-то стало уже ясно. Вернее, на чем конкретно происходит затык:

Если в предложенный выше код:
Код: plaintext
1.
2.
3.
4.
5.
6.
WinsockCom.Connect 
Do Until WinsockCom.State =  7  
  DoEvents 
Loop 
sSendData =  "USER "  & sUser & vbCrLf 
WinsockCom.SendData sSendData


добавить кусок (он у меня сидел в функции WaitToFTP):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WinsockCom.Connect 
Do Until WinsockCom.State =  7  
  DoEvents 
Loop 
' получение данных от FTP здесь, а не через соб. DataArrival
Do
  DoEvents
  WinsockCom.GetData sData, vbString
Loop Until Len(sData) >  0 
sSendData =  "USER "  & sUser & vbCrLf 
WinsockCom.SendData sSendData


то тут глюки и начинаются. Дело в цикл. вызовах метода WinsockCom.GetData. Если пошагово проходить этот код, то данные успевают прийти, цикл не крутиться и программа работает дальше...

Дальше идет теоретическая чать:
Я могу конечно ошибаться, но проблему я вижу вот в чем. После Connect данные от FTP (его ответ) должны прийти на winsock (соотв. разместиться где-то в памяти.) Однако пока они идут, мы уже успеваем вызвать метод WinsockCom.GetData, который обращается к этому к этому куску памяти (ии еще кого напрягает по этому поводу), а там пока шишь, метод сидит в цикле поэтому вызвается еще раз и еще раз и...... видимо это так напрягает систему,access,winsock, что она из за этих бесконечн. GetData не может положить пришедшие данные от сервака, даже несмотря на DoEvents, видимо в этом случае DoEvents не помогает контрол получить соб. DataArrival-получение данных, а он продолжает накручивать GetData.... тогда понятно откуда тормоза потом в системе идут и Access подвисает.

Это только мое мнение, так что прошу высказываться...

Решение: попробую вставить в цикл с GetData небольшую паузу, поглядим ...
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32245178
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, GetData надо делать обязательно после события DataArrival.
Либо в самой обработке события, либо в обработке события выставлять флаг, а в другой процедуре его проверять.
...
Рейтинг: 0 / 0
Вот такой код...., работает только пополам
    #32245189
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, про флаг я тоже подумал... посмотрим... сравним..

Для чего я просто все это затеял. Хотелось весь connect засунуть в одну процедуру/функцию, что бы потом можно было использовать достаточно независимо, тем более, что в справке никаких предостережений на счет использования GetData я не видел и в примерах часто видел такое же использование GetData без события DataArrival...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вот такой код...., работает только пополам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]