Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread и передача параметров, Как я решил это делать 
:(
    Опции темы
AntonSaburov
Дата 18.3.2003, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Данная заметка не претендует на истину в последней инстанции - если кто-то нашел иное решение проблемы, милости прошу свои комментарии.

Итак, как только я стал разбираться с тредами мне само собой захотелось передать параметры в функцию, которая в этом треде исполняется. Увидев стандартное использование тредов, я не нашел возможности передать параметры и полез в MSDN (а куда же еще). И что я там вижу

Код

using System;
using System.Threading;

public class SimpleThread{

  public delegate void Start (object o);

  private class Args{
     public object o;
     public Start s;
     public void work(){
     s(o);
  }
  }

  public static Thread CreateThread (Start s, Object arg){

     Args a = new Args();
     a.o = arg;
     a.s = s;
     Thread t = new Thread (new ThreadStart (a.work));
     return t;
  }
}

class Worker{
  public static void WorkerMethod(object o){
     Console.WriteLine ("WorkerMethod: " + o);
  }
}

public class Work{
  public static void Main(){
     Thread t = SimpleThread.CreateThread (new SimpleThread.Start(Worker.WorkerMethod), 51);
     t.Start ();
     t.Join (Timeout.Infinite);
  }
}


Может я и стал с годами тупее, но сразу осознать, что и как происходит, к своему сожалению, я не смог.
После того, как я все-таки разобрался, я стал укладывать все в понятное русло для того, чтобы использовать технику передачи параметров в дальнейшем. И тут я понял еще более неприятное - я не могу это делать просто и понятно для себя.

После некоторых раздумий и проб я пошел по пути, который напоминает работу с тредами в JAVA - наследование класса Thread. Но т.к. наследовать в NET от Thread нельзя пришлось писать класс-обертку, после которой я все-таки смог увидеть, как мне быстро делать треды и использовать параметры.

Идея очень простая и иллюстрируется кодом:

Код

using System;
using System.Threading;

public class MyThread
{
   private Thread intThread;
   public int param1;
   public int param2;

   public MyThread(int new_param1, int new_param2)
   {
       param1 = new_param1;
       param2 = new_param2;
       intThread = new Thread(new ThreadStart(MyHandle));
   }

   public void Start()
   {
       intThread.Start();
   }

   private void MyHandle()
   {
       // Код процедуры, которая может использовать param1 и param2
       Console.WriteLine("Param1={0} Param2={1}", param1, param2);
   }
}

public class Worker
{
   public static void Main()
   {
       MyThread my = new MyThread(10,20);
       my.Start();
       Thread.Sleep(5000);
       Console.WriteLine("Finished");
   }
}


Данный пример в принципе должен давать исчерпывающие ответ.
Видно, что теперь мы можем передавать любое количество параметров понятным способом. Во всяком случае мне гораздо проще использовать такой подход, нежели который предлагает Microsoft.

Я не гарантирую, что кто-то такое уже не придумал, но пусть эта информация не пропадет.
PM MAIL WWW ICQ   Вверх
pa6kevi4
Дата 24.6.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.9.2009

Репутация: нет
Всего: нет



А что делать, если ваш метод MyHandle() с параметрами?
Допустим, public void MyHandle(string message, MessageType messageType)
Как тогда запустить поток?
PM MAIL   Вверх
mihryak
Дата 24.6.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



что-то вы усложняете
если не нужно возвращаемое значение, нет необходимости дожидаться окончания, то прекрасно подойдёт Action
функциональность обоих примеров (+ произвольное количество параметров, + возможность использовать замыкания) повторяет такой код
Код

    class ThreadExecutor
    {
        public void Execute(Action action)
        {
            new Thread(() => action()).Start();
        }
    }

    class Program
    {
        private static void Method(int a, int b)
        {
            Console.Write("{0} + {1} = {2}", a, b, a + b);
        }

        private static void Main()
        {
            int a = 2;
            int b = 3;

            new ThreadExecutor().Execute(() => Method(a, b));
            Thread.Sleep(1000);
            Console.ReadKey();
        }
    }


пс. откуда у темы 1782 просмотров?   smile 
ппс. посмотрел на дату smile

Это сообщение отредактировал(а) mihryak - 24.6.2010, 12:22
PM MAIL ICQ   Вверх
VirusUZ
  Дата 25.6.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 9.4.2010
Где: Узбекистан, Навои й обл.

Репутация: -1
Всего: -2



private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(salom));
        }
        void salom(object virus)
        {
            MessageBox.Show("rahim");
        }
--------------------
Virus
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.