На главную

.:: Меню ::.
Новости
Программы
Статьи
Полезные ссылки

Вывод сообщений при работе таймера в визуальные элементы на форме (из процедуры Timer.Elapsed)

Разделы Статьи / .NET / VB.NET /

Назад

Т.к. таймер работает в отдельном потоке, выыводить разные сообщения напрямую в интерфейсные контролы невозможно, например, это внутри процедуры события timer.Elapsed работать не будет

Textbox1.text &= Now()

Вы увидите такое сообщение:

Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on.

(см. рис)

 

А как же тогда выводить какую-либо информацию о выполнении процесса и т.п.?

Есть выход.

Просмотрела много сайтов в сети, но все решения были слишком сложны: часто предлагались решения с использвоанием класса BackgroundWorker, а также другие с примерами кода на C# .

 

Предлагаю свое простое решение на VB.NET (на Visual Studio 2010, .Net Framework 4):

Итак, у Вас есть приложение Windows Forms , есть форма, а на ней текстбокс ( Textbox1 ) .

 

Вот что пишем в коде:

 

Дублирую для копирования:

Public Class FormTimer

    Private tTimer As System.Timers.Timer    'собственно таймер

    Private strMsgText As String = ""    'для сбора сообщений

    Private intTimerCount As Integer = 0     'счетчик "тиков"

    Private Sub FormTimer_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'при загрузке формы создаем таймер и даем ему нужные настройки

        tTimer = New System.Timers.Timer()

        tTimer.Enabled = True

        tTimer.Interval = 2000 'Интервал 2с.

        'связиваем временное событие таймера с нужной процедурой

        AddHandler tTimer.Elapsed, AddressOf TimerTick

        tTimer.AutoReset = True

        tTimer.Start()

    End Sub

    Private Sub TimerTick(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)

        'событие, срабатывающее на каждый тик таймера

        intTimerCount += 1

        strMsgText = "Таймет тик-так " & intTimerCount

        Me.Invoke(New Action(AddressOf SetText))

    End Sub

    Private Sub SetText()

        'процедура выводящая сообщения в визуальный интерфейс

        TextBox1.Text &= Now.ToString & " - " & strMsgText & vbCrLf

    End Sub

End Class

 

В итоге получаем:

Надеюсь кому-нибудь пригодится :)

 

Новости сайта

Друзья сайта
Русский сайт системы KooBoo CMS

PROИТ - Office 365, AD, Active Directory, Sharepoint, C#, Powershell

Хостинг предоставлен VEDU.RU - Поволжским
Образовательным
Порталом





 © Центр ИТ, СИОТО, 2002-2009. Разработчики: webmaster(a)vedu.ru