С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/202: Рейтинг темы: голосов - 202, средняя оценка - 4.60
 Аватар для NightMan
2 / 2 / 1
Регистрация: 21.04.2009
Сообщений: 42
.NET 4.x

Передача в новый поток метода с параметрами

04.11.2010, 19:08. Показов 39307. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди нужен хелп: хочу создавать отдельные потоки для каждого клиента, но не получается их создать, если метод запускаемый в потоке имеет параметры, допустим так:

C#
1
2
client1 = new Thread(new ThreadStart(ping(i, adr)));
client1.Start();
т.е. если бы метод ping не имел параметров, все запускается, а если ping имеет параметры, но компилятор пишет, что метод не существует, или тип того.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2010, 19:08
Ответы с готовыми решениями:

Рекурсивный метод, глубокая ветка if/else или написание правильного метода с параметрами
Если коротко о проблеме, то директор дает задачу, работники офиса ее выполняют, сортировка идет по специализации и безделью. Если все...

Invoke и новый поток
Пытаюсь запустить поток, в котором будут изменяться свойства listview. Но судя по зависаниям программы, у меня это не получилось. Вот что я...

Алгоритм метода записи изображения в поток Image.Save
Всем привет! myImage.Save(myStream, ImageFormat.Gif); Данный метод Save() класса Image добавляет изображение в указанный...

16
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.11.2010, 19:28
C#
1
2
3
4
5
6
client1 = new Thread(ping);
client1.Start(/* параметр */); // создайте структуру с нужными Вам полями и передавайте как параметр.
...
ping(object obj) {
 
}
1
 Аватар для NightMan
2 / 2 / 1
Регистрация: 21.04.2009
Сообщений: 42
04.11.2010, 19:37  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
C#
1
2
3
4
5
6
client1 = new Thread(ping);
client1.Start(/* параметр */); // создайте структуру с нужными Вам полями и передавайте как параметр.
...
ping(object obj) {
 
}
А можно немного подробнее?

Я понял, что нужно написать так:

C#
1
2
client1 = new Thread(new ThreadStart(ping));
client1.Start(i, adr);
А вот мой класс пинг с параметрами:

C#
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
26
27
        public void ping (int number, string Adress)
        {
            bool ping = true;
            while (ping)
            {
                Ping pingSender = new Ping();
                IPAddress address = IPAddress.Loopback;
 
                // Создаём буфер из 32 байтов информации для трансляции.
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
 
                // Ждём ответа одну секунду.
                int timeout = 1000;
                PingReply reply = pingSender.Send(Adress, timeout, buffer);
                
                if (reply.Status == IPStatus.Success)
                {
                    clients[number] = 1; MessageBox.Show("клиент онлайн");
                }
                else
                {
                    ping = false; clients[number] = 0; MessageBox.Show("клиент офф");
                }
                Thread.Sleep(1000);
            }
        }
При этом компилятор выдаёт сообщение, что метод все равно должен быть перегружен, т.к. имеет параметры. Подскажите плз как создавать структуру?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.11.2010, 19:43
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        struct PingStruct
        {
            internal string addr;
            internal int number;
        }
...
            Thread th = new Thread(ping);
            PingStruct ps = new PingStruct();
            ps.number = 10;
            ps.addr = "ip";
            th.Start(ps);
...
        // ping должен быть объявлен только так!
        void ping(object obj) {
            if (obj.GetType() != typeof(PingStruct))
                return;
            PingStruct ps = (PingStruct)obj;
            // Работаете с ps
        }
0
 Аватар для NightMan
2 / 2 / 1
Регистрация: 21.04.2009
Сообщений: 42
04.11.2010, 21:00  [ТС]
Большое спасибо, разобрался, вот метод ping для выполнения в разных потоках:

C#
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
26
27
28
29
30
31
        public void ping(object obj)
        {
            if (obj.GetType() != typeof(PingStruct)) //если принимаемая структура не соответствует 
                return; //указанной - воззвращаемся
            PingStruct ps = (PingStruct)obj; //если все нормально - выполняем дальше
            
            bool ping = true; //задаём переменную, чтобы пинговался клиент, пока не оффнется
            while (ping)
            {
                Ping pingSender = new Ping();
                IPAddress address = IPAddress.Loopback;
 
                // Создаём буфер из 32 байтов информации для трансляции.
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
 
                // Ждём ответа одну секунду.
                int timeout = 1000;
                PingReply reply = pingSender.Send(ps.addr, timeout, buffer);
                
                if (reply.Status == IPStatus.Success) //если пинг успешен
                {
                    clients[ps.number] = 1; //записываем успешность в массив
                }
                else
                {
                    ping = false; clients[ps.number] = 0; //и наоборот.
                }
                Thread.Sleep(1000); //засыпаем поток на секунду, необходимую для ответа пинга
            }
        }
А вот этот код нужно использовать для создания разных потоков с методом ping:

C#
1
2
3
4
5
client1 = new Thread(ping);
ps.number = 0;
ps.addr = adr;
client1.IsBackground = true;
client1.Start(ps);
0
Заблокирован
05.11.2010, 08:11
Лучший ответ Сообщение было отмечено как решение

Решение

Вот тебе пример запуска в потоке метода с параметрами
C#
1
2
3
4
5
6
7
8
9
10
11
private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread MyThread1 =
                 new System.Threading.Thread(delegate() { MyMetod(2,2); });
            MyThread1.Start();
 
        }
       void  MyMetod( int a, int b)
        {
            MessageBox.Show((a * b).ToString());
        }
4
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
05.11.2010, 08:17
Реально без гемороя проще создать анонимную функцию и передать параметры уже в делегате как сделал SSV.
1
0 / 0 / 0
Регистрация: 23.11.2010
Сообщений: 13
19.04.2011, 18:50
Доброго дня! Норм тема, та же проблема. Я делаю так

Thread^ dThread = gcnew Thread( gcnew ParameterizedThreadStart( &ServMonTempNETWinService::ThreadProcSta rtServMail) );
dThread->Start(3);

передаю как бы с параметром, мне нужно в потоке только номер, а теперь мне надо передать ещё один параметр с текстом. Хотел сделать как в последнем посте, но я делаю на С++, не катит. Помогите на плюсы перевести или можно как нить по другому ещё???
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
19.04.2011, 19:17
В плюсах, кажется, нет анонимных методов.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
19.04.2011, 22:07
Artemprodigy, нашел 4 ссылки по теме, прочтите, возможно то что вам надо
body90, на плюсах то нет, но на VS можно писать так что стандарту и не снилось, у майкрософта свои приоритеты, короче проще погуглить
http://www.codeproject.com/KB/... egate.aspx
http://www.codeproject.com/KB/... egate.aspx
http://msdn.microsoft.com/en-u... s.80).aspx
http://msdn.microsoft.com/en-u... s.71).aspx
1
0 / 0 / 0
Регистрация: 23.11.2010
Сообщений: 13
20.04.2011, 11:41
Не смог я разобраться по этим ссылкам((( Начал пробовать как предложили в первых постах, с помощью структуры, но тоже не успешно, не хочет он передавать...
C++
1
2
3
4
5
6
7
8
9
10
11
struct InfoStr
{
     char text [1024];
     int number;
}datchik_param;
 
 sprintf(ps->text,"Выход значения датчика № %0.2X%0.2X%0.2X%0.2X%0.2X%0.2X c IP:",g_datchik[t].n_unit[0],g_datchik[t].n_unit[1],g_datchik[t].n_unit[2],g_datchik[t].n_unit[3],g_datchik[t].n_unit[4],g_datchik[t].n_unit[5]);
 strcat (ps->text,inet_ntoa(g_datchik[t].IP));
 
Thread^ dThread = gcnew Thread( gcnew ParameterizedThreadStart( &ServMonTempNETWinService::ThreadProcStartServMail) );
dThread->Start((ps);
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
20.04.2011, 13:08
http://www.codeproject.com/KB/... Class.aspx
0
20.04.2011, 15:06

Не по теме:

Всё же перейдя на шарп понимаешь как некрасиво выглядит код на многих остальных языках...

2
20.04.2011, 19:15

Не по теме:

body90, и в тоже время, понимаешь что ему нехватает многих приколов С++ (:

1
21.04.2011, 17:35

Не по теме:

Тоже согласен на 101%

0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
21.04.2011, 18:54
NightMan, да, кстати, чуть не забыл, весь дот нет это обертка под винапи, можете посмотреть либы дотнета и поймете как можно сделать аналог делегата на плюсах (:
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
22.04.2011, 14:57
какой аналог? вы о чем? там вообще-то указатели используются для этого дела...

Не по теме:

PS. некропостеры

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2011, 14:57
Помогаю со студенческими работами здесь

Передать объект класса как аргумент метода в поток
Имеется класс npimono, код использования: private void loadListButton_Click(object sender, EventArgs e) { ...

Передача параметров в поток
Всем привет! Знаю что тема где-то была, не нашел. Нужно запустить в потоке метод с параметрами без Parametrize. Видел раньше через...

Передача переменных в поток
Собсно дело обстоит так: Есть richTextBox1, в котором есть 15(допустим) логинов и паролей, в формате: логин;пароль. Мне нужно...

Передача в поток несколько параметров
В отдельном потоке делаю открытие окна. Нужно в поток передать текст для заголовка окна и собственно его содержимое. Делал так: public...

Передача ссылочного параметра в поток
Есть класс и в нем объявлен метод, который принимает ссылочный параметр ref string, необходимо выполнить этот метод в новом потоке и...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru