Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Comanche

Нужен не тормозной способ определения коннекта к Сети

01.02.2011, 18:14. Показов 1632. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сказать, что тема избитая - не сказать ничего )
Есть три способа:
1. Через АПИ RASEnum.... - приемлемо только для dial-up
2. Через АПИ GetConnectedState (или что-то в этом роде) - скажет, что вы в Сети, даже если вы просто в локалке
3. Через АПИ-функции из wininet.dll (попытка открыть любой корректный URL) - тупит по-страшному.

Короче говоря, ни одного нормального способа ( Последний - самый надёжный в плане результата: если пинговать Yahoo, то т.к. эта служба никогда не 'падает' (по кр. мере верим в это), то мы точно (99.9%) будем знать - в Сети мы или нет. Только вот если в программе делать такую проверочку из АПИ-таймера, скажем раз в 5-10 секунд, то если ничего в программе в этот момент не делать, то можно жить, - а вот если момент проверки коннекта попадёт на открытие popup-меню, то у меня даже Win2000 пишет, что 'Программа не отвечает'!!! ну а менюха 'замораживается'... есть и другие похожие бяки.

Выносить в отдельный поток? (так руки и не дошли до этого; на VBNET.RU, кстати, все почему-то очень ругали использование CreateThread под VB...)

Выносить в отдельный EXE-шник (на худой конец)? который бы жил сам по себе, просто результат проверки через SendMessage периодически пулял бы в главное окно.

Ещё как?

Главное - чтоб не 'тупило'.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2011, 18:14
Ответы с готовыми решениями:

Как заходить по локальной сети с мтс коннекта?
Прошу помощи! Ребят как заходить по локальной сети с мтс коннекта? Чтобы обмануть сайты которые работую только по локальной сети. ...

Способ определения языка текущего пользователя.
private void Window_Loaded(object sender, RoutedEventArgs e) { bool languageSearched = false; for (int i = 0; i <...

Универсальный способ определения расположения пользовательских папок
Приветствую ! Вопрос: как правильно выудить из реестра инфорацию о расположении пользовательских папок ? на примере рабочего...

12
Messir
02.02.2011, 01:09
пингами попробуй
Comanche
02.02.2011, 10:58
Ты имеешь в виду 'ping http://xxxxx.xxx.xx > D:output.txt',
а потом смотреть, чё в txt-шнике?
Comanche
02.02.2011, 12:53
В общем, сделал через внешний EXE-шник. Если кому интересно - вот код проекта этого EXE-шника:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
'
' §§§§§§§§§§§§§§§§§§§§§§§§§§§ В модуль: §§§§§§§§§§§§§§§§§§§§§§§§§§§
'
Option Explicit
'
' Все API-декларации опускаю для краткости
'
Public timerID As Long, params() As String
'
Sub Main()
    Dim i As Integer
    
    App.TaskVisible = False
    
    If App.PrevInstance Then Exit Sub
    If Len(Command$) = 0 Then Exit Sub
    ' через командную строку передаётся следующая информация (через pipe-символ):
    ' 1-й параметр: хэндл статус-бара
    ' 2-й параметр: номер панели статус-бара
    ' 3-й параметр: текст для он-лайна
    ' 4-й параметр: хэндл иконки для он-лайна
    ' 5-й параметр: текст для офф-лайна
    ' 6-й параметр: хэндл иконки для офф-лайна
    ' 7-й параметр: частота проверки коннекта (мс)
    ' 8-й параметр: ID вызывающего процесса
    
    params = Split(Command$, '|')
    If Not (LBound(params) = 0 And UBound(params) = 7) Then Exit Sub
    
    For i = 0 To 7
        If i = 2 Or i = 4 Then
            ' это строковые параметры
            If Len(Trim$(params(i))) = 0 Then Exit Sub
        Else
            ' это строковое представление Long-параметров
            If Not IsNumeric(params(i)) Then Exit Sub
        End If
    Next
    
    SetThreadPriority GetCurrentThread, THREAD_PRIORITY_BELOW_NORMAL
    SetPriorityClass GetCurrentProcess, IDLE_PRIORITY_CLASS
    
    Load frmMain
    
End Sub
'
Public Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    
    ' сначала проверяем, что вызывающее приложение ещё 'живо':
    If IsWindow(CLng(params(0))) = 0 Then
        KillTimer 0, timerID
        Unload frmMain
        End
    End If
    
    If CheckInternetConnection Then
        SendMessage CLng(params(0)), SB_SETICON, 0, ByVal CLng(params(3))
        WriteStatusText CLng(params(7)), CLng(params(0)), CLng(params(1)), params(2)
    Else
        SendMessage CLng(params(0)), SB_SETICON, 0, ByVal CLng(params(5))
        WriteStatusText CLng(params(7)), CLng(params(0)), CLng(params(1)), params(4)
    End If
    
End Sub
'
Public Sub WriteStatusText(ByVal callerPID As Long, ByVal stbarHwnd As Long, _
                           ByVal panelIndex As Long, ByVal msgText As String)
    
    Dim hProcess As Long, pMem As Long, w As Long
    
    ' Открываем процесс с правами записи и чтения:
    hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, callerPID)
    ' Если не получилось - выходим:
    If hProcess = 0 Then Exit Sub
    ' Резервируем кусок памяти в контексте процесса:
    pMem = VirtualAllocEx(hProcess, ByVal 0, ByVal (Len(msgText) + 256), MEM_COMMIT, PAGE_READWRITE)
    If pMem <> 0 Then
        ' если получилось, то копируем строку в память процесса:
        WriteProcessMemory hProcess, ByVal pMem, ByVal msgText, Len(msgText), w
        ' посылаем сообщение статус-бару:
        Call SendMessage(stbarHwnd, SB_SETTEXT, panelIndex, ByVal pMem)
        ' Освобождаем память:
        VirtualFreeEx hProcess, ByVal pMem, 1024, MEM_RELEASE
    Else
        ' Сюда попадаем, если не удалось выделить память:
        '' MsgBox 'Cannot allocate memory in context of selected process...', vbCritical, 'Error'
    End If
    ' Закрываем процесс:
    CloseHandle hProcess
 
End Sub
'
Private Function CheckInternetConnection() As Boolean
    Dim hInet As Long
    Dim hUrl As Long
Comanche
02.02.2011, 12:58
Кстати, в процедуре TimerProc, после SendMessage и WriteStatusText, не помешает добавить вызов 'RedrawWindow CLng(params(0)), .....', чтобы обновить статус-бар.
Comanche
02.02.2011, 13:18
Однако, выявился неприятный эффект: текст, установленный в бэйсиковском статус-баре через SendMessage, исчезает при WM_PAINT ( т.е. если форму основного проекта чуть-чуть двинуть, то в панели слово 'Он-лайн' (ну или 'Офф-лайн') пропадёт до следующего цикла таймера... придётся искать решение этой бяки.
Comanche
02.02.2011, 14:34
В общем, плюнул и переделал всё через DDE. Получилось в два раза компактнее, и никаких проблем с перерисовкой статус-бара: основной проект выступает в роли DDE-сервера и ловит строковые сообщения от DDE-клиента, который проверяет в таймере коннект к Сети и через LinkExecute отправляет серверу либо '0', либо '1'. А уж основной проект - получив эту строку от клиента - прописывает соотв. текст в панель собственного статус-бара без всяких SendMessage.

Единственное, что непонятно, - это то, что строка доходит от клиента к серверу в исковерканном виде: после нолика (или единички) идут 2-3 каких-то нечитаемых символа, и приходится их отсекать...
0 / 0 / 1
Регистрация: 09.01.2011
Сообщений: 47
02.02.2011, 15:10
Доброго всем времени суток !
Есть еще один вариант - через Winsock.

P.S. 'После очередной депрессии , космонавт Джонсон решил повеситься,
но тут наступила невесомоть ...'
0
Comanche
02.02.2011, 15:37
Согласен. А что через него отправлять? HTTP GET? - тогда в буфер винсока полезет вся страница Yahoo, и это сожрёт столько же времени, что и InternetOpenURL из wininet.dll... я не сильный знаток HTTP, посему вопрос: что ещё вместо 'GET' можно послать по HTTP, чтобы быстро убедиться в доступности URL'а (т.е. в наличии коннекта)?!
Messir
02.02.2011, 15:42
Ну, когда я говорил про пинги, я вообще-то имел в виду IcmpCreateFile/IcmpSendEcho/IcmpCloseHandle...
pl
51 / 17 / 6
Регистрация: 18.05.2007
Сообщений: 1,322
02.02.2011, 16:49
2Comanche: HEAD
0
Comanche
02.02.2011, 17:06
СПАСИБО ВСЕМ!!!
Буду пробовать.
Comanche
04.02.2011, 16:56
2Messir:
остановился на твоём варианте: выигрыш в скорости - в 3 с лишним раза (если сравнивать с InternetOpenUrl). Ещё раз BIG THANX!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2011, 16:56
Помогаю со студенческими работами здесь

Быстрый способ определения цвета пиксела координатам x, y
В общем задача такая , нужен быстрый способ определения цвета пиксела в настоящее время на экране по заданным координатам x, y мне нужно...

Самый простой способ определения языка пользователя
Добрый день! Подскажите, пожалуйста, какой самый простой из качественных способов определить язык пользователя? В гугле много информации,...

Подскажите третий способ определения числа ребер графа
Подскажите, пожалуйста, третий способ определения числа ребер графа. 1) непосредственный подсчет по диаграмме 2)сумма степеней вершин...

Предложить иной способ определения того, попадает ли заданная точка в ромб
Нужно написать программу, где пользователь водит координаты точки , а программа должна вывести попадает ли точка в ромб или нет. Sub...

способ определения текущего режима втавки/замены для редактирования текстового поля
Может кто-нибудь подскажет способ определения текущего режима втавки/замены для редактирования текстового поля. Заранее премного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru