Страница: 1 | 2 | 3 |
|
Вопрос: Как сделать ожидание подключения интернет соед.?
|
Добавлено: 16.07.10 10:31
|
|
Номер ответа: 18 Автор ответа: BG(Алексей)
Вопросов: 26 Ответов: 295
|
Профиль | | #18
|
Добавлено: 18.07.10 09:59
|
Держи. Набросал на скорую руку.
По всем вопросам о типах данных в МСДН.
- Public Class InternetConnectionChecker
- Implements IDisposable
-
- Event ConnectionStatusChanged(ByVal sender As Object, ByVal state As Boolean)
-
- Private _checkEvent, _stopEvent, _check_or_stop() As AutoResetEvent
- Private _thrd As Thread
- Private _exit, _stop As Boolean
- Private _formContext As WindowsFormsSynchronizationContext
- Private _pingingList As Generic.List(Of String)
-
- Public Sub New()
- _pingingList = New Generic.List(Of String)
- _pingingList.Add("www.google.com")
- _pingingList.Add("www.yahoo.com")
- _pingingList.Add("www.yandex.com")
- _checkEvent = New AutoResetEvent(False)
- _stopEvent = New AutoResetEvent(False)
- _check_or_stop = New AutoResetEvent() {_checkEvent, _stopEvent}
- _formContext = TryCast(WindowsFormsSynchronizationContext.Current, WindowsFormsSynchronizationContext)
- _thrd = New Thread(AddressOf Check) With {.Name = "CheckThread"}
- _thrd.Start()
- End Sub
-
- Public Sub CheckConnection()
- If _formContext IsNot Nothing Then _checkEvent.Set()
- End Sub
-
- Private Sub Check()
- Dim connected As Boolean
- Do While Not _exit
- WaitHandle.WaitAny(_check_or_stop)
- If _stop Then Continue Do
- For Each url As String In _pingingList
- Try
- connected = My.Computer.Network.Ping(url, 3000)
- Exit For
- Catch ex As Exception
- connected = False
- End Try
- Next
- _formContext.Post(AddressOf Me.OnConnectionStatusChanged, connected)
- Loop
- End Sub
-
- Private Sub OnConnectionStatusChanged(ByVal state As Object)
- RaiseEvent ConnectionStatusChanged(Me, CBool(state))
- End Sub
-
- #Region " IDisposable Support "
- Private disposedValue As Boolean = False
-
- Protected Overridable Sub Dispose(ByVal disposing As Boolean)
- If Not Me.disposedValue Then
- If disposing Then
- _stop = True : _exit = True
- _stopEvent.Set()
- If Not _thrd.Join(500) Then _stopEvent.Set() : _thrd.Join()
- End If
- End If
- Me.disposedValue = True
- End Sub
-
- Public Sub Dispose() Implements IDisposable.Dispose
- Dispose(True)
- GC.SuppressFinalize(Me)
- End Sub
- #End Region
-
- End Class
и работать так
- Imports System.Threading
-
- Public Class Form1
-
- Private _tmr As Timer
- WithEvents _checker As InternetConnectionChecker
-
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- _tmr.Dispose()
- _checker.Dispose()
- End Sub
-
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- _checker = New InternetConnectionChecker
- _tmr = New Timer(AddressOf Me.CheckConnection, _checker, 0, 60000)
- End Sub
-
- Private Sub CheckConnection(ByVal state As Object)
- DirectCast(state, InternetConnectionChecker).CheckConnection()
- End Sub
-
- Private Sub _checker_ConnectionStatusChanged(ByVal sender As Object, ByVal state As Boolean) Handles _checker.ConnectionStatusChanged
- MsgBox(state)
- End Sub
- End Class
Ответить
|
Номер ответа: 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 не разбудит.
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму