Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
391 / 310 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
1
.NET 4.x

Как в потоке запустить процедуру с параметрами

10.10.2014, 23:24. Просмотров 3306. Ответов 10
Метки нет (Все метки)

Пытаюсь сделать отдельный поток для процедуры.
Получаю такую ошибку:
Не удалось разрешить перегрузку, так как ни один доступный "New" не может быть вызван с данными аргументами:
'Public Sub New(start As System.Threading.ParameterizedThreadStart)': Метод "Private Sub Request(offset As Integer, ByRef sum As Integer, ByRef total As Integer)" не имеет сигнатуры, совместимой с делегатом "Delegate Sub ParameterizedThreadStart(obj As Object)".
'Public Sub New(start As System.Threading.ThreadStart)': Метод "Private Sub Request(offset As Integer, ByRef sum As Integer, ByRef total As Integer)" не имеет сигнатуры, совместимой с делегатом "Delegate Sub ThreadStart()". E:\...\...n\code\...\...\Clean.vb
Кто может русским языком объяснить что значит эта ошибка?

Как делаю поток (я новичек в программировании, поэтому возможны серьезные ошибки)

1. Импортировал
vb.net
1
Imports System.Threading
2. Создал поток
vb.net
1
Private Thread_1 As New Thread(AddressOf Request)
3. Процедура
vb.net
1
2
3
Private Sub Request(ByVal offset As Integer, ByRef sum As Integer, ByRef total As Integer)
...
End Sub
4. Запуск потока
vb.net
1
2
3
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Thread_1.Start()
End Sub
Что не так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2014, 23:24
Ответы с готовыми решениями:

Как запустить функцию в новом потоке с несколькими параметрами?
Вся суть вопроса в заголовке. Было бы неплохо если есть маленький пример. Ибо с одним параметром то...

Запустить процедуру с параметрами
Вечер добрый. Прошу подсказать, как сделать процедуру чтобы можо было ее запускать отдельной...

Как запустить операцию в отдельном потоке (Network.Ping)
... выполнении этой части кода: If My.Computer.Network.Ping("192.168.0.2", 200) Then Пингуется...

Как запустить в С# rnaapp с параметрами в командной строке?
Help me, please ... Как запустить в С# rnaapp с параметрами в командной строке?

10
Почетный модератор
21203 / 8938 / 1080
Регистрация: 11.04.2010
Сообщений: 11,014
11.10.2014, 00:13 2
Дело в том, что Вы создали процедуру с параметрами, но при запуске оной в потоке ни один не передали.
Не знаю, как в новых версиях FW, а в 3.5 можно передать лишь один параметр.

Но что делать, если у нас хоть лопни - а параметра два?

А мы сделаем все равно один, но не простой, а структурированный.
То есть, мы будем передавать параметры не по одному, а один раз, но пачкой. Под пачкой я имею ввиду, например, элемент структуры.

В коде ниже мы создали структуру, создали процедуру, принимающую этот элемент, создали поток, слепили нужный элемент, и втюхали его в параметр потока:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Structure Params
        Dim I As Integer
        Dim S As String
    End Structure
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Th As New System.Threading.Thread(AddressOf Work)
        Dim Param As New Params With {.I = 10, .S = "Str"}
        Th.Start(Param)
    End Sub
 
    Sub Work(ByVal Par As Params)
        Me.Text = Par.S
        Button1.Text = Par.I
    End Sub
5
391 / 310 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
11.10.2014, 01:17  [ТС] 3
Памирыч, я вот такое поймал при нажатии на кнопку в программе:
Как в потоке запустить процедуру с параметрами

Сейчас у меня голова не варит уже, завтра утром попробую переварить на свежую голову.
0
Почетный модератор
21203 / 8938 / 1080
Регистрация: 11.04.2010
Сообщений: 11,014
11.10.2014, 02:06 4
Дядя Корней, скомпилируйте приложение, и запускайте экзешник.
Это конечно, не очень правильно, но суть Вы поймете
2
199 / 214 / 87
Регистрация: 21.04.2013
Сообщений: 403
11.10.2014, 03:03 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Памирыч Посмотреть сообщение
можно передать лишь один параметр.
Но что делать, если у нас хоть лопни - а параметра два?
А мы сделаем все равно один, но не простой, а структурированный.
Еще можно передать как массив типа Object.
vb.net
1
Th.Start(New Object() {10, "Str"})
Цитата Сообщение от Дядя Корней Посмотреть сообщение
вот такое поймал при нажатии на кнопку в программе
Дядя Корней, а так:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Imports System.Threading
 
Public Class Form1
    Dim SC As SynchronizationContext
 
    Structure Params
        Dim I As Integer
        Dim S As String
    End Structure
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SC = SynchronizationContext.Current
        Dim Th As New System.Threading.Thread(AddressOf Work)
        Dim Param As New Params With {.I = 10, .S = "Str"}
        Th.Start(Param)
    End Sub
 
    Sub Work(ByVal Par As Params)
        SC.Send(AddressOf SetParams, Par)
    End Sub
    Sub SetParams(ByVal Par As Params)
        Me.Text = Par.S
        Button1.Text = Par.I
    End Sub
End Class
3
391 / 310 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
11.10.2014, 10:07  [ТС] 6
Petr_S, спасибо, так запустилась.


Цитата Сообщение от Памирыч Посмотреть сообщение
Дело в том, что Вы создали процедуру с параметрами, но при запуске оной в потоке ни один не передали.
Под параметрами имеется в виду эта часть строки?
vb.net
1
(ByVal offset As Integer, ByRef sum As Integer, ByRef total As Integer)
если да, то покажите пожалуйста как вставить эти параметры в этот код:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Imports System.Threading
 
Public Class Form1
    Dim SC As SynchronizationContext
 
    Structure Params
        Dim I As Integer
        Dim S As String
    End Structure
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SC = SynchronizationContext.Current
        Dim Th As New System.Threading.Thread(AddressOf Work)
        Dim Param As New Params With {.I = 10, .S = "Str"}
        Th.Start(Param)
    End Sub
 
    Sub Work(ByVal Par As Params)
        SC.Send(AddressOf SetParams, Par)
    End Sub
    Sub SetParams(ByVal Par As Params)
        Me.Text = Par.S
        Button1.Text = Par.I
    End Sub
End Class
тогда я сразу пойму. Сейчас я пока не совсем понимаю момент с передачей параметров.
Буду очень благодарен.
0
Почетный модератор
21203 / 8938 / 1080
Регистрация: 11.04.2010
Сообщений: 11,014
11.10.2014, 13:22 7
Цитата Сообщение от Дядя Корней Посмотреть сообщение
как вставить эти параметры в этот код
Вы из них будете делать структуру, например, такую
vb.net
1
2
3
4
5
    Structure Params
        Dim offset As Integer
        Dim sum As Integer
        Dim total As Integer
    End Structure

Ну и по сценарию.
Только там у Вас ByRef, возможно, будут сложности
1
391 / 310 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
11.10.2014, 13:52  [ТС] 8
Памирыч, спасибо, стало на один шаг понятнее

А чему тогда будут равны мои данные из структуры?
Вот в вашем примере I = 10, S = "Str"
vb.net
1
Dim Param As New Params With {.I = 10, .S = "Str"}
Я попробовал написать так
vb.net
1
Dim Param As New Params With {.offset, .sum, .total}
но студия естественно ругается
Как в потоке запустить процедуру с параметрами
0
Почетный модератор
21203 / 8938 / 1080
Регистрация: 11.04.2010
Сообщений: 11,014
11.10.2014, 14:01 9
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Я попробовал написать так
Значения присвоить все же нужно, иначе передается пустой элемент

У меня через знак "равно" значения присвоены, а у Вас - нет
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 253
07.12.2016, 20:44 10
Лучше поздно, чем никогда
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Памирыч, я вот такое поймал при нажатии на кнопку в программе:
Сейчас у меня голова не варит уже, завтра утром попробую переварить на свежую голову.
Замените строку:
vb.net
1
Me.Text = Par.S
На:
vb.net
1
2
3
4
5
If Me.InvokeRequired = True Then
   Me.Invoke(Sub() Me.Text = Par.S)
Else
   Me.Text = Par.S
End If
Вангую, что со следующей строкой будет то же самое, поэтому напишите вместо нее код по аналогии.
2
391 / 310 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
07.12.2016, 21:07  [ТС] 11
Stass48, да, давно это было. Я тогда еще только начинал программировать, многого не знал и не понимал.
Сейчас это уже пройденный этап.

Но все равно, спасибо, может кому-то тоже на будущее пригодится.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2016, 21:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как запустить стороннее приложение с определенными параметрами
Есть программа paping.exe, она пингует по портам! Нужно с помощью vb.net программы запустить её с...

Как вызвать процедуру с параметрами, которых нет в вызываемом объекте
Есть на форме полоса прокрутки и у неё есть процедура обработки события. Private Sub...

Как запустить процедуру в аппликации из HTML документа
К примеру есть форма (окно) с WebBrowser в нём. Загружаем с помощью wb.Navigate некий HTML файл с...

Запустить файл с параметрами, указанными в TextBox
Для начала, на всякий, извиняюсь за своё нубство :( Сижу на VS 10 Ult, делаю свои "творения" через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.