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

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

01.02.2011, 18:14. Показов 1598. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru