JeezyWonder Ответов: 2

Таймер.проблема прошедшее событие


я застрял с таймером, может кто-нибудь объяснить, пожалуйста, как это событие работает? что нужно вызвать в основной форме, чтобы запустить этот модуль? Я создал модуль под названием "пример", попытался заставить таймер писать в форме 1 текст метки" привет " каждые 2 секунды, но при запуске приложения ничего не происходит. Кто-нибудь поможет? Спасибо. Я использую WinForms

Что я уже пробовал:

Imports System.Timers
Public Module example
    Private aTimer As Timer
    Public Sub Main()

        ' Create a timer and set a two second interval.
        aTimer = New System.Timers.Timer()
        aTimer.Interval = 2000

        ' Hook up the Elapsed event for the timer.  
        AddHandler aTimer.Elapsed, AddressOf OnTimedEvent

        ' Have the timer fire repeated events (true is the default)
        aTimer.AutoReset = True

        ' Start the timer
        aTimer.Enabled = True

    End Sub
    Private Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
        Form1.Label1.Text = " hello"
    End Sub

End Module

2 Ответов

Рейтинг:
13

Dave Kreskowiak

Это не работает, потому что Прошедшее событие вызывается в другом потоке[^] из потока пользовательского интерфейса (запуск). Вы не можете касаться элементов управления пользовательского интерфейса ни из чего, кроме потока пользовательского интерфейса. В этом случае вам придется вызвать метод в потоке пользовательского интерфейса, чтобы изменить текст в текстовом поле.

Private aTimer As Timer = Nothing

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    aTimer = New Timer() With {
        .Interval = 2000
    }

    ' Hook up the Elapsed event for the timer.
    AddHandler aTimer.Elapsed, AddressOf OnTimedEvent

    ' Have the timer fire repeated events (true is the default)
    aTimer.AutoReset = True

    ' Start the timer
    aTimer.Enabled = True
End Sub

Private Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
    SetTextBoxText("Elapsed")
End Sub

Private Sub SetTextBoxText(message As String)
    If Me.InvokeRequired Then
        Invoke(Sub()
                   SetTextBoxText(message)
               End Sub)
    Else
        TextBox1.Text = "Elapsed"
    End If
End Sub


JeezyWonder

Большое спасибо, я хотел выяснить использование таймера, потому что я хочу, чтобы событие таймера всегда проверяло наличие последовательных портов avaiblae, и если его какой-либо из них автоматически подключается к ним. Вы можете проверить это пожалуйста:

Частная суб методе form1_load(отправителя как объект, а равно EventArgs) обрабатывает ключевое слово mybase.Загрузить
aTimer = новый таймер() С {
. Интервал = 2000
}

- Подсоедините прошедшее событие к таймеру.
AddHandler aTimer.Истекло, Адрес OnTimedEvent

"Пусть таймер запускает повторяющиеся события (по умолчанию true)
aTimer.Автоматического Сброса = Истина

- Включи таймер
aTimer.Включен = Истина
конец подводной лодки
Private Sub OnTimedEvent(источник как объект, e как система.Таймеры.ElapsedEventArgs)
SetTextBoxText ("Истекло")
Конец Подводной Лодки

Public Sub SetTextBoxText(сообщение в виде строки)
Если Я. InvokeRequired Тогда
Вызов(Суб()
SetTextBoxText(сообщение)
Конец Подводной Лодки)
Еще
Если SerialPort1.Тогда IsOpen = False
Dim Portnames As String () = SerialPort. GetPortNames
cboComPort.Предметы.AddRange(Имена Портов)
cboComPort.Text = Имена Портов(0)
SerialPort1.Имя_порта = cboComPort.Текст
SerialPort1.Открыть()
Конец, Если
Конец, если
Конец Подводной Лодки

Рейтинг:
1

Peter Vegter

Ой...

' Start the timer
aTimer.Start


Dave Kreskowiak

Не требовать. Установка значения Enabled в True делает то же самое.

Peter Vegter

Да, вы правы. Сожалеть об этом. Спасибо.