Как закрыть программу, пока коннектиться Winsock ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
zen2s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.05.2011 (Вс) 10:39

Как закрыть программу, пока коннектиться Winsock ?

Сообщение zen2s » 22.05.2011 (Вс) 11:03

Проект на VB5
Прога в цикле коннектиться к ряду девайсов через winsock.
Если юзер закрывает программу, пока идет Winsock1.State = sckConnecting, остается незакрытый процесс со всеми вытекающими...
Как грамотнее убить все это дело при выходе ?
Сейчас реализовано так:
Private Function NetSetConnect(IPAddress As String, Port As String) As Boolean
...
On Error GoTo ErrConnect
Winsock1.Connect
On Error GoTo 0

Do While Winsock1.State = sckConnecting
DoEvents ' Сюда попадаем после Form_Unload ...
Loop
...

Буду благодарен за совет, как либо прервать все ожидание при выходе, либо дождаться изменения состояния соединения и выйти корректно (с закрытием коннекта).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как закрыть программу, пока коннектиться Winsock ?

Сообщение Хакер » 22.05.2011 (Вс) 11:07

Ну, собственно, нужно просто правильно написать её, нормально используя Event-Driven-парадигму.

Мыслить надо так:
Смерть процесса наступает либо при возврате из EntryPoint, либо по явному вызову ExitProcess.
Если говорить о VB, то предыдущее условие наступает, когда управление возвращается из Sub Main и ни остаётся ни одного живого объекта (смотря что наступит позже.
Исходя из этого, для того, чтобы процесс умер, достаточно выполнить оба из вышеперечисленных условий: добиться смерти всех порождённых объект, добиться возврата выполнения из Sub Main. А для этого, как я уже сказал, над просто правильно писать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

zen2s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.05.2011 (Вс) 10:39

Re: Как закрыть программу, пока коннектиться Winsock ?

Сообщение zen2s » 22.05.2011 (Вс) 11:27

Так я-ж не отрицаю, что написано неправильно, потому и не работает корректно.
Просто я сто лет писал под дос на языках типа clipper, turbo c, turbo pascal и т.п.
Там все просто и понятно, вышел из main и привет. И не попадешь туда пока не завершаться все циклы и ожидания.
С виндовыми языками сложнее... Так вот я и спросил, КАК убить этот цикл ожидания ???
Извини, но из твоего ответа я понял, что нужно "добиться смерти всех порождённых объектов", но это вроде мне понятно и так, а вот как это сделать?
Я пробовал вводить булевскую переменную и контролировать ее в функции Form_Unload.
Так получается запретить закрытие формы, но не применимо на практике:
If boolConnectionInProgress Then
cancel = 1
End If

А так не получается, поскольку теперь зависаем в этом DoEvents (и вот это мне блин непонятно, почему?):
If boolConnectionInProgress Then
While boolConnectionInProgress
lblConnectInfo2.Caption = "Подождите, идет закрытие сетевого соединения..."
DoEvents
Wend
End If

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как закрыть программу, пока коннектиться Winsock ?

Сообщение Хакер » 22.05.2011 (Вс) 11:39

zen2s писал(а):. Так вот я и спросил, КАК убить этот цикл ожидания ???

Exit Do
Но сам по себе этот цикл целиком и полностью против родной для VB event-driven парадигмы. Не нужно ничего ждать циклом, и делать нужные действия после цикла. Нужно нужные действия делать в обработчике события.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

zen2s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.05.2011 (Вс) 10:39

Re: Как закрыть программу, пока коннектиться Winsock ?

Сообщение zen2s » 22.05.2011 (Вс) 11:44

Понял, буду пробовать работать через события...
По поводу Exit Do, так тоже не работает, если boolConnectionInProgress присваивать False в Form_Unload:

Private Function NetSetConnect(IPAddress As String, Port As String) As Boolean
...
boolConnectionInProgress = True
Do While Winsock1.State = sckConnecting
DoEvents
If boolConnectionInProgress = False Then Exit Do
Loop
boolConnectionInProgress = False

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как закрыть программу, пока коннектиться Winsock ?

Сообщение Хакер » 22.05.2011 (Вс) 11:52

zen2s писал(а):Do While Winsock1.State = sckConnecting
DoEvents
If boolConnectionInProgress = False Then Exit Do
Loop

Эта гадость будет использовать 100 % ресурсов процессора. Эта гадость тебе не нужна.
Что касается того, что Exit Do не работает, то это неправда. Ищи ошибку где-то ещё.

Оформляй код соответствующим тегом, иначе будешь наказан.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

zen2s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 22.05.2011 (Вс) 10:39

Re: Как закрыть программу, пока коннектиться Winsock ?

Сообщение zen2s » 22.05.2011 (Вс) 11:59

Большое спасибо за советы!
Будем курить event-ы.
Насчет 100% ты абсолютно прав, буду избавляться.
Еще раз спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54

    TopList  
cron