threading.timer
От: DsergN  
Дата: 20.11.07 08:53
Оценка:
Здравствуйте!
Подскажите пожалуйста, есть
таймер

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.[......]

???
Re: threading.timer
От: Аноним  
Дата: 20.11.07 09:08
Оценка:
Здравствуйте, 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>???
Доброго !
Через делегата
С уважением !
Re[2]: threading.timer
От: DsergN  
Дата: 20.11.07 09:19
Оценка:
А>Доброго !
А>Через делегата
А>С уважением !

А по подробней можно, делегата чего???
Re: threading.timer
От: .Den Украина  
Дата: 20.11.07 09:28
Оценка:
Здравствуйте, DsergN, Вы писали:

DN>Здравствуйте!

DN>Подскажите пожалуйста, есть
DN>таймер
DN>???

Читай MSDN по Control.Invoke
Re: threading.timer
От: Pavel M. Россия  
Дата: 20.11.07 12:47
Оценка:
Здравствуйте, DsergN, Вы писали:

DN>Здравствуйте!

DN>Подскажите пожалуйста, есть
DN>таймер

DN>???


Проблема в том, что UI находится в другом потоке — отдельном и менять всякие свойства из других потоков нельзя. Для этого есть, например, таймер специальный System.Windows.Forms.Timer . Если в его обработчике писать работу с формой — проблем не будет. Если ОЧЕНЬ УЖ хочется использовать этот таймер, тогда нужно делать


myForm.Invoke((ThreadStart)delegate
{
  label.Text = someText;
}
);


Тогда данное действие выполнится в UI потоке и проблем вновь не будет.
--------------------------
less think — do more
Re[2]: threading.timer
От: DsergN  
Дата: 20.11.07 16:14
Оценка:
Здравствуйте, 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 или нет.
Re[3]: threading.timer
От: Pavel M. Россия  
Дата: 21.11.07 14:26
Оценка: 1 (1)
Здравствуйте, DsergN, Вы писали:

DN>Здравствуйте, Pavel M., Вы писали:



PM>>[c#]

PM>>myForm.Invoke((ThreadStart)delegate

DN>да, надо использовать таймер независимый от основной формы, только я в C# не очень. PLIZ можно на словах, в частности myForm-это проиницилированная объектная переменная типа Form или нет.


не важно, на самом деле. это может быть любой контрол с формы или сама форма, все события выполнятся в потоке обработки сообщений данного окна.
--------------------------
less think — do more
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.