Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: Как сделать ожидание подключения интернет соед.? Добавлено: 16.07.10 10:31  

Автор вопроса:  Michael Melchakov | ICQ: 302272185 

Ответить

  Ответы Всего ответов: 32  

Номер ответа: 16
Автор ответа:
 Michael Melchakov



ICQ: 302272185 

Вопросов: 12
Ответов: 31
 Профиль | | #16 Добавлено: 17.07.10 21:36
хотя вот сейчас заметил.. С помощью фаера блокировал траффик полностью - иногда подвисает прога... При отключенной сети - проблем нет.

Ответить

Номер ответа: 17
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #17 Добавлено: 17.07.10 22:08
выложу прогу и код
не надо.. :)
Я это делал стопиццот раз и знаю о чем говорю... ты выполняешь синхронную операцию в UI потоке.. этим все сказано..

Ответить

Номер ответа: 18
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #18 Добавлено: 18.07.10 09:59
Держи. Набросал на скорую руку.
По всем вопросам о типах данных в МСДН.
  1. Public Class InternetConnectionChecker
  2.     Implements IDisposable
  3.  
  4.     Event ConnectionStatusChanged(ByVal sender As Object, ByVal state As Boolean)
  5.  
  6.     Private _checkEvent, _stopEvent, _check_or_stop() As AutoResetEvent
  7.     Private _thrd As Thread
  8.     Private _exit, _stop As Boolean
  9.     Private _formContext As WindowsFormsSynchronizationContext
  10.     Private _pingingList As Generic.List(Of String)
  11.  
  12.     Public Sub New()
  13.         _pingingList = New Generic.List(Of String)
  14.         _pingingList.Add("www.google.com")
  15.         _pingingList.Add("www.yahoo.com")
  16.         _pingingList.Add("www.yandex.com")
  17.         _checkEvent = New AutoResetEvent(False)
  18.         _stopEvent = New AutoResetEvent(False)
  19.         _check_or_stop = New AutoResetEvent() {_checkEvent, _stopEvent}
  20.         _formContext = TryCast(WindowsFormsSynchronizationContext.Current, WindowsFormsSynchronizationContext)
  21.         _thrd = New Thread(AddressOf Check) With {.Name = "CheckThread"}
  22.         _thrd.Start()
  23.     End Sub
  24.  
  25.     Public Sub CheckConnection()
  26.         If _formContext IsNot Nothing Then _checkEvent.Set()
  27.     End Sub
  28.  
  29.     Private Sub Check()
  30.         Dim connected As Boolean
  31.         Do While Not _exit
  32.             WaitHandle.WaitAny(_check_or_stop)
  33.             If _stop Then Continue Do
  34.             For Each url As String In _pingingList
  35.                 Try
  36.                     connected = My.Computer.Network.Ping(url, 3000)
  37.                     Exit For
  38.                 Catch ex As Exception
  39.                     connected = False
  40.                 End Try
  41.             Next
  42.             _formContext.Post(AddressOf Me.OnConnectionStatusChanged, connected)
  43.         Loop
  44.     End Sub
  45.  
  46.     Private Sub OnConnectionStatusChanged(ByVal state As Object)
  47.         RaiseEvent ConnectionStatusChanged(Me, CBool(state))
  48.     End Sub
  49.  
  50. #Region " IDisposable Support "
  51.     Private disposedValue As Boolean = False
  52.  
  53.     Protected Overridable Sub Dispose(ByVal disposing As Boolean)
  54.         If Not Me.disposedValue Then
  55.             If disposing Then
  56.                 _stop = True : _exit = True
  57.                 _stopEvent.Set()
  58.                 If Not _thrd.Join(500) Then _stopEvent.Set() : _thrd.Join()
  59.             End If
  60.         End If
  61.         Me.disposedValue = True
  62.     End Sub
  63.  
  64.     Public Sub Dispose() Implements IDisposable.Dispose
  65.         Dispose(True)
  66.         GC.SuppressFinalize(Me)
  67.     End Sub
  68. #End Region
  69.  
  70. End Class


и работать так
  1. Imports System.Threading
  2.  
  3. Public Class Form1
  4.  
  5.     Private _tmr As Timer
  6.     WithEvents _checker As InternetConnectionChecker
  7.  
  8.     Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  9.         _tmr.Dispose()
  10.         _checker.Dispose()
  11.     End Sub
  12.  
  13.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  14.         _checker = New InternetConnectionChecker
  15.         _tmr = New Timer(AddressOf Me.CheckConnection, _checker, 0, 60000)
  16.     End Sub
  17.  
  18.     Private Sub CheckConnection(ByVal state As Object)
  19.         DirectCast(state, InternetConnectionChecker).CheckConnection()
  20.     End Sub
  21.  
  22.     Private Sub _checker_ConnectionStatusChanged(ByVal sender As Object, ByVal state As Boolean) Handles _checker.ConnectionStatusChanged
  23.         MsgBox(state)
  24.     End Sub
  25. End Class

Ответить

Номер ответа: 19
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #19 Добавлено: 18.07.10 10:07
Упс, сорри. Замени
  1.                 Try
  2.                     connected = My.Computer.Network.Ping(url, 3000)
  3.                     Exit For
  4.                 Catch ex As Exception
  5.                     connected = False
  6.                 End Try

на
                Try
                    connected = My.Computer.Network.Ping(url, 3000)
                    Exit For
                Catch ex As Exception
                    Continue For
                End Try

Ответить

Номер ответа: 20
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #20 Добавлено: 18.07.10 16:29
BG(Алексей), старик.. ты явно перегнул палку.

Ответить

Номер ответа: 21
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #21 Добавлено: 18.07.10 16:36
В смысле?

Ответить

Номер ответа: 22
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #22 Добавлено: 18.07.10 16:52
в смысле перестарался, имхо незачем было так все тут наворачивать.. это напоминает поговорку на счет того что из пушки по воробьям..

Ответить

Номер ответа: 23
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #23 Добавлено: 18.07.10 16:55
Аааа ты об этом. А что тут навороченного, обычный BackGroundWorker получился.
Я знаю, что можно было сделать код в два раза меньше. Но мне захотелось так. :)

Ответить

Номер ответа: 24
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #24 Добавлено: 18.07.10 23:28
BG, респект, неплохая демонстрация. Не подскажешь по чем учился?

Я бы сделал в классе таймер. И по таймеру проверять активность подключения, если активность изменилась (произошло подключение/отключение), генерировать событие.
Не очень удобно, на мой взгляд, что таймер вынесен за пределы класса.

Ответить

Номер ответа: 25
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #25 Добавлено: 18.07.10 23:29
да у него моцк лопнет от твоего "шедевра"..

Ответить

Номер ответа: 26
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #26 Добавлено: 19.07.10 00:55
Я бы сделал в классе таймер.

а я бы вторичный поток усыплял за ненадобностью до следующей проверки.. (не люблю таймеры)

Ответить

Номер ответа: 27
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #27 Добавлено: 19.07.10 02:02
Artyom пишет:
Не очень удобно, на мой взгляд, что таймер вынесен за пределы класса.
Ну перенести его в класс не составляет большого труда. Просто, как я говорил, это сделано на скорую руку.

Artyom пишет:
И по таймеру проверять активность подключения,
Здесь не понял, что ты имел ввиду.

Artyom пишет:
Не подскажешь по чем учился?
Я кроме МСДН-а и ObjectBrowser ничего не читаю. А вообще, мой учитель(когда-то давно) дал мне задание сделать свой BackGroundWorker, в котором должно быть:
1. Три потока
2. Они должны распределять работу между собой
3. Об окончании сигнализировать и засыпать(ожидать следующее задание)
4. Так же они не должны заканчивать свою жизнь Thread.Abort и всё такое прочее.
5. Ну а самое главное, это не заморачиваться с Form.Invoke, выброс эвентов должен был ставиться в о основной поток.
Я просидел с этим заданием ну ооооочень долго. Сделал, плоховато но сделал. Ну а дальше, начинаешь соображать все больше.

EROS пишет:
да у него моцк лопнет от твоего "шедевра"..
EROS, я что тебя как-то обидел? К чему ты это? В твоём профессионализме я не сомневаюсь ни на секунду. И довольно многому научился на твоих постах.


EROS пишет:
а я бы вторичный поток усыплял за ненадобностью до следующей проверки.. (не люблю таймеры)
Ну это самый безобидный таймер - System.Threading.Timer.
А вторичный поток и так спит, пока его AutoResetEvent не разбудит.

Ответить

Номер ответа: 28
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #28 Добавлено: 19.07.10 07:50
EROS, я что тебя как-то обидел? К чему ты это?

Да не принимй ты все так близко к сердцу.. к тебе притензий никаких, сделал и сделал.. Просто работу жалко, топикстартер мало того не оценит, так еще и не поймет твоего кода..

Ответить

Номер ответа: 29
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #29 Добавлено: 20.07.10 00:25
:)
Для этого я и написал
BG(Алексей) пишет:
По всем вопросам о типах данных в МСДН.


EROS пишет:
 ... топикстартер мало того не оценит, так еще и не поймет твоего кода..

Для тех кто не поймет, могу предложить простейший вариант
  1.     Public Function CheckConnection() As Boolean
  2.         Dim request As System.Net.WebRequest = System.Net.WebRequest.Create(New System.Uri("http://www.google.com"))
  3.         Try
  4.             Dim response As System.Net.WebResponse = request.GetResponse
  5.             response.Close() : Return True
  6.         Catch ex As Exception
  7.             Return False
  8.         End Try
  9.     End Function

Ответить

Номер ответа: 30
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #30 Добавлено: 20.07.10 00:48
Для тех кто не поймет, могу предложить простейший вариант

ну и пришли к тому, от чего уходили.. синхронный вызов..
Хочешь пари? ТС повесит этот код на ButtonClick или FormLoad и будет говорить что у меня форма висит!!! :))))))))) Все именно так и будет..

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам