Здравствуйте!
Подскажите пожалуйста, есть
таймер
mVarTimer = New Threading.Timer(AddressOf WorkTime, Me, 0, 1000)
вызывает
Public Sub WorkTime(ByVal StateObj As Object)
Dim State As Tim = CType(StateObj, Tim)
Dim tmpVarSec As Integer
System.Threading.Interlocked.Increment(State.CurrentTime)
tmpVarSec = System.Threading.Interlocked.Read(State.CurrentTime)
If tmpVarSec > State.mvarTimeWorkMax Then
State.mVarTimer.Dispose()
System.Threading.Interlocked.Exchange(State.TimerWork, 0)
RaiseEvent TimerIncrementSecunda(tmpVarSec, True)
Else
RaiseEvent TimerIncrementSecunda(tmpVarSec, False)
End If
End Sub
главная программа
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler My.Application.tmpV.TimerIncrementSecunda, AddressOf TimerEvent
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
My.Application.tmpV.startTimer()
End Sub
Private Sub TimerEvent(ByVal curtime As Integer, ByVal stopTimer As Boolean)
Label1.Text = curtime '-здесь ошибка.обращение к данным созданным в другом потоке
End Sub
Каким образом мне сделать так что поток вызываемый таймером мог видеть данные потока главной формы в частности
my.application.[......]
???
Здравствуйте, DsergN, Вы писали:
DN>Здравствуйте!
DN>Подскажите пожалуйста, есть
DN>таймер
DN>DN>mVarTimer = New Threading.Timer(AddressOf WorkTime, Me, 0, 1000)
DN>
DN>вызывает
DN>DN>Public Sub WorkTime(ByVal StateObj As Object)
DN> Dim State As Tim = CType(StateObj, Tim)
DN> Dim tmpVarSec As Integer
DN> System.Threading.Interlocked.Increment(State.CurrentTime)
DN> tmpVarSec = System.Threading.Interlocked.Read(State.CurrentTime)
DN> If tmpVarSec > State.mvarTimeWorkMax Then
DN> State.mVarTimer.Dispose()
DN> System.Threading.Interlocked.Exchange(State.TimerWork, 0)
DN> RaiseEvent TimerIncrementSecunda(tmpVarSec, True)
DN> Else
DN> RaiseEvent TimerIncrementSecunda(tmpVarSec, False)
DN> End If
DN> End Sub
DN>
DN>главная программа
DN>DN> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DN> AddHandler My.Application.tmpV.TimerIncrementSecunda, AddressOf TimerEvent
DN> End Sub
DN> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DN> My.Application.tmpV.startTimer()
DN> End Sub
DN> Private Sub TimerEvent(ByVal curtime As Integer, ByVal stopTimer As Boolean)
DN> Label1.Text = curtime '-здесь ошибка.обращение к данным созданным в другом потоке
DN> End Sub
DN>
DN>Каким образом мне сделать так что поток вызываемый таймером мог видеть данные потока главной формы в частности
DN>DN>my.application.[......]
DN>
DN>???
Доброго !
Через делегата

С уважением !
А>Доброго !
А>Через делегата
А>С уважением !
А по подробней можно, делегата чего???
Здравствуйте, DsergN, Вы писали:
DN>Здравствуйте!
DN>Подскажите пожалуйста, есть
DN>таймер
DN>???
Проблема в том, что UI находится в другом потоке — отдельном и менять всякие свойства из других потоков нельзя. Для этого есть, например, таймер специальный System.Windows.Forms.Timer . Если в его обработчике писать работу с формой — проблем не будет. Если ОЧЕНЬ УЖ хочется использовать этот таймер, тогда нужно делать
myForm.Invoke((ThreadStart)delegate
{
label.Text = someText;
}
);
Тогда данное действие выполнится в UI потоке и проблем вновь не будет.
Здравствуйте, Pavel M., Вы писали:
PM>Проблема в том, что UI находится в другом потоке — отдельном и менять всякие свойства из других потоков нельзя. Для этого есть, например, таймер специальный System.Windows.Forms.Timer . Если в его обработчике писать работу с формой — проблем не будет. Если ОЧЕНЬ УЖ хочется использовать этот таймер, тогда нужно делать
PM>PM>myForm.Invoke((ThreadStart)delegate
PM>{
PM> label.Text = someText;
PM>}
PM>);
PM>
PM>Тогда данное действие выполнится в UI потоке и проблем вновь не будет.
да, надо использовать таймер независимый от основной формы, только я в C# не очень. PLIZ можно на словах, в частности myForm-это проиницилированная объектная переменная типа Form или нет.