Потоки + классы

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Потоки + классы

Сообщение FireFenix » 20.06.2009 (Сб) 13:25

Играюсь с потоками
Код: Выделить всё
'На формочке 2 кнопочки bStart и bStop + лейбл Lable1
Imports System.Threading

Public Class Main
    Public Temp As New Temp

    Private Sub bStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bStop.Click
        Temp.StopFlag = True
        bStart.Enabled = True
    End Sub

    Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click
        Temp.StopFlag = False
        bStart.Enabled = False

        Dim t As New Thread(AddressOf Temp.DoTheWork)
        t.Start(0)

        Dim t2 As New Thread(AddressOf Temp.DoTheWork)
        t2.Start(9999999)
    End Sub
End Class

Код: Выделить всё
Public Class Temp
    Public StopFlag As Boolean
    Delegate Sub InvokeDelegate(ByVal Message As Integer)
    Public Sub Print(ByVal Message As Integer)
        Main.Label1.Text = Message
    End Sub

    Sub DoTheWork(ByVal start As Integer)
        Dim Message As Integer = start
        Do
            Main.Label1.BeginInvoke(New InvokeDelegate(AddressOf Print), Message)
            Thread.Sleep(1)

            Message += 1
        Loop Until StopFlag
    End Sub
End Class

Вылетает с ошибкой - "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна." на Main.Label1.BeginInvoke
А если сложить всё в один класс, то проблем нет.
Как вызвать поток из соседнего класса и при этом обращаться к контролам в форме?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Потоки + классы

Сообщение Williams » 20.06.2009 (Сб) 13:58

Похоже на очередной велосипед. Что именно ты хочешь осуществить?
И вы думаете, что вас оставят в живых после прочтения этого поста?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Потоки + классы

Сообщение FireFenix » 20.06.2009 (Сб) 14:07

Брррр...... Хочу чтобы варило кофе в 4х потоках :D

Хочу, чтобы после выполнения потока - обновлять прогресс бар и пару лейблов, при том что поток родитель находится в отдельном классе
Впринципе работоспособность того, что я написал - меня бы устроила :)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Потоки + классы

Сообщение Williams » 20.06.2009 (Сб) 14:35

FireFenix писал(а):Брррр...... Хочу чтобы варило кофе в 4х потоках :D

Хочу, чтобы после выполнения потока - обновлять прогресс бар и пару лейблов, при том что поток родитель находится в отдельном классе
Впринципе работоспособность того, что я написал - меня бы устроила :)


В отдельном классе у тебя не поток, а метод.

А вообще, для такого рода задач достаточно функционала BackgroundWorker'а.
И вы думаете, что вас оставят в живых после прочтения этого поста?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Потоки + классы

Сообщение FireFenix » 21.06.2009 (Вс) 11:57

Один фиг, если использовать Backgroundworker вместо Thread, то при вызове Invoke/BeginInvoke у лейбла сёравно вылетает ошибка
Ести какие-нибудь идеи?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Потоки + классы

Сообщение Williams » 21.06.2009 (Вс) 12:57

Обрабатывай событие прогресса воркера, предварительно вызывая его через .ReportProgress.
И вы думаете, что вас оставят в живых после прочтения этого поста?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Потоки + классы

Сообщение FireFenix » 21.06.2009 (Вс) 13:21

Можно пример рабочего кода? Или линк на реализацию таких вещей.... а то ничего путного найти не могу :(
Последний раз редактировалось FireFenix 21.06.2009 (Вс) 14:27, всего редактировалось 1 раз.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Потоки + классы

Сообщение Williams » 21.06.2009 (Вс) 13:28

FireFenix писал(а):Можно пример рабочего кода?



Код: Выделить всё
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        For index = 1 To 100
            System.Threading.Thread.Sleep(10)
            BackgroundWorker1.ReportProgress(index)
        Next

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        BackgroundWorker1.WorkerReportsProgress = True
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub
И вы думаете, что вас оставят в живых после прочтения этого поста?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Потоки + классы

Сообщение FireFenix » 21.06.2009 (Вс) 14:10

Сделал так
Код: Выделить всё
Imports System.Threading

Public Class Form1
    Public Temp As New Temp

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Temp.BW.WorkerReportsProgress = True
    End Sub

    Private Sub bStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bStop.Click
        Temp.StopFlag = True
        bStart.Enabled = True
    End Sub

    Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click
        Temp.StopFlag = False
        bStart.Enabled = False

        Temp.BW.RunWorkerAsync()
    End Sub
End Class

Код: Выделить всё
Public Class Temp
    Public StopFlag As Boolean
    Public WithEvents BW As New System.ComponentModel.BackgroundWorker

    Private Sub BW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork
        Dim Text As String
        Dim Index As Integer = 0

        Do
            Index += 1

            Text = "Text = " & Index

            BW.ReportProgress(Index, Text)
            Thread.Sleep(1)
        Loop Until StopFlag
    End Sub

    Private Sub BW_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BW.ProgressChanged
        Form1.Label1.Text = e.ProgressPercentage & " " & e.UserState
    End Sub
End Class

Вроде всёработает... Спасибо Williams!
А для общего развития - почему через инвок не работало? причём у меня всегда InvokeRequired было False
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Потоки + классы

Сообщение FireFenix » 21.06.2009 (Вс) 20:31

В ходе многих поисков и методом тыка вывел
Код: Выделить всё
Imports System.Threading
Imports System.ComponentModel
Код: Выделить всё
Public Class Form1
    Public Temp As New Temp
    Public CallBack As CallBackInvoker

    Public Delegate Sub RunDelegate(ByVal CallBack As CallBackInvoker, ByVal Start As Integer)

    Private Sub bStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bStop.Click
        Temp.StopFlag = True
        bStart.Enabled = True
    End Sub

    Public Structure Data
        Dim CallBack As CallBackInvoker
        Dim Integ As Integer
    End Structure

    Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click
        Temp.StopFlag = False
        bStart.Enabled = False

        Dim Data As New Data
        Data.CallBack = New CallBackInvoker(AddressOf ShowText)
        Data.Integ = 0

        Dim t As New Thread(AddressOf Temp.Run)
        t.IsBackground = True
        t.Start(Data)

        Data.Integ = 99999999

        Dim t2 As New Thread(AddressOf Temp.Run)
        t2.IsBackground = True
        t2.Start(Data)
    End Sub

    Public Sub ShowText(ByVal Text As String)
        Label1.Text = Text
    End Sub
End Class
Код: Выделить всё
Public Class Temp
    Public StopFlag As Boolean

    Public Sub Run(ByVal Data As Form1.Data)
        Dim Message As Integer = Data.Integ
        Do
            Data.CallBack.Invoke("Text = " & Message)
            Thread.Sleep(300)

            Message += 1
        Loop Until StopFlag
    End Sub
End Class
Код: Выделить всё
Public Class CallBackInvoker
    Private CallBack As SendOrPostCallback
    Private AsyncOperation As AsyncOperation

    Public Sub New(ByVal CallBack As SendOrPostCallback)
        Me.CallBack = CallBack
        AsyncOperation = AsyncOperationManager.CreateOperation(Nothing)
    End Sub

    Public Sub Invoke(ByVal Data As Object)
        AsyncOperation.Post(CallBack, Data)
    End Sub
End Class
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54

    TopList