Sub или Function с параметрами для потока.

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

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Sub или Function с параметрами для потока.

Сообщение Mikle » 22.04.2009 (Ср) 12:54

Разбираюсь с потоками, возникает вопрос, можно ли сделать передачу адреса ф-ции с параметрами в поток? Как тогда передавать сами параметры.
Например у меня массив потоков, использующий общую ф-цию (проверял, работает). Хочу, чтобы внутри ф-ции можно было узнать индекс текущего потока.

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

Re: Sub или Function с параметрами для потока.

Сообщение Williams » 22.04.2009 (Ср) 13:20

Индекс текущего потока... А Thread.CurrentThread не пойдет?
И вы думаете, что вас оставят в живых после прочтения этого поста?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Sub или Function с параметрами для потока.

Сообщение Mikle » 22.04.2009 (Ср) 14:36

У меня большой массив данных для обработки, если бы программа обработки данных знала индекс текущего потока, то она могла бы автоматически выбрать и обработать нужную часть данных, например при четырех потоках данные делятся на четыре части, каждая обрабатывается своим потоком. Как тут поможет Thread.CurrentThread? Это ведь не индекс потока, а сам поток. Разве что делать проверку:
Код: Выделить всё
for n=0 to 3
  if Thread.CurrentThread = MyTread(n) then Index=n: exit for
next n

Но что-то это некрасиво... да и вообще, с этой задачей я справлюсь, но вопрос остается, как передать параметры? Как вернуть значение, если это ф-ция?
Последний раз редактировалось Mikle 22.04.2009 (Ср) 14:55, всего редактировалось 1 раз.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Sub или Function с параметрами для потока.

Сообщение MIT » 22.04.2009 (Ср) 14:41

Функции передаются при помощи делегатов. Delegate и AddressOf тебе в помощь :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

Re: Sub или Function с параметрами для потока.

Сообщение Williams » 22.04.2009 (Ср) 14:46

К слову, есть еще Thread.ManagedThreadId. Можно бы было приспособить.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Sub или Function с параметрами для потока.

Сообщение Mikle » 22.04.2009 (Ср) 14:56

До Delegate я еще не добрался :o

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Sub или Function с параметрами для потока.

Сообщение ANDLL » 22.04.2009 (Ср) 15:33

ParameterizedThreadStart
Принимает один параметр.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

euroflock
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 26.02.2009 (Чт) 12:54

Re: Sub или Function с параметрами для потока.

Сообщение euroflock » 23.04.2009 (Чт) 13:14

Сначала описывается делегат (функция или процедура) для потока а затем (при старте потока) просто передауются все необходимые параметры в делегирующую процедуру. Например так:
Код: Выделить всё
Sub КласснаяПроцедура
   ...
   Dim Переменная1 As Boolean = False
   Dim Переменная2 As String = "важный текст"
   ...
   Dim Поток(50) As Thread ' объявляем необходимое количество потоков
   For i As Integer = 0 To Поток.Count - 1 ' задаём процедуру для каждого потока
        Поток(i) = New Thread(AddressOf ПроцедураОбработкиПотока) ' объявляем делегат AddressOf без указания параметров
        Поток(i).Start(i, Переменная1, Переменная2) ' запускаем поток с одновременной передачей параметров делегату
   Next
   Dim ВсеПотокиЗавершены As Boolean = False
   While Not ВсеПотокиЗавершены ' здесь ожидаем завершения всех имеющихся потоков (если кому нужно)
        For i As Integer = 0 To Поток.Count - 1
             If Поток(i).IsAlive Then : ВсеПотокиЗавершены = False : Exit For
             Else : ВсеПотокиЗавершены = True : End If : Application.DoEvents()
        Next : Application.DoEvents()
   End While
End Sub 'КласснаяПроцедура

Sub ПроцедураОбработкиПотока(ByVal [НомерПотока] As Integer, ByVal [Логика] As Boolean, ByVal [Текст] As String)
   ... ' описываем действия, которые будут обрабатываться в разных потоках
   ... ' и возможно с разными переданными параметрами для каждого из них
End Sub

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Sub или Function с параметрами для потока.

Сообщение Mikle » 24.04.2009 (Пт) 10:10

Спасибо, разобрался, все работает!
Особый респект euroflock за пример.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Sub или Function с параметрами для потока.

Сообщение Mikle » 24.04.2009 (Пт) 13:37

Сделал пример, реализующий один и тот же рендер в разное кол-во потоков. На двухъядерном процессоре получаю почти двукратное увеличение быстродействия при переходе с одного на два потока, что вполне ожидаемо. Но дальше что-то странное - при 4, 8, 16... потоках равномерность теряется (это естественно), но быстродействие растет! За счет чего? Гипертрединг? Насколько понимаю, он прироста давать не должен, а всего лишь уменьшает потери на переключении задач.
Прилагаю пример, это почти релиз третьей версии SR2D. Задавайте число потоков только степенями двойки, на другие числа проект не рассчитан.
Вложения
NET.rar
(149.34 Кб) Скачиваний: 60


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

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

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

    TopList  
cron