Re: Многопоточность
От: Аноним  
Дата: 14.09.06 14:55
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>При запуске нового потока в С++ ему передается в качестве аргумента указатель (void*), в который размещаются все необходимые данные.

А>При запуске нового потока в C# используется делегат ThreadStart(), который аргументов не принимает. Передать данные я смог только через статические поля класса, метод которого использовался для запуска потока.

А>Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object?

А>Если есть, то как?

Люди, а что велик-то изобретаем?! Для этого в каждом потоке есть слоты данных.
А именно:

Thread.AllocateDataSlot (...)
Thread.AllocateNamedDataSlot (...)

Алгоритм такой:

1. создал поток (он ещё не запущен)
2. создал слот
3. записал в слот
4. запустил поток
5. получил данные из запущенного потока Thread.CurrentThread.GetData (...)
6. убил слот
Re[2]: Многопоточность
От: Воронков Василий Россия  
Дата: 14.09.06 14:58
Оценка:
Здравствуйте, Аноним, Вы писали:

Да тут все еще проще. На самом деле в дотнете 2.0, на котором изначально приводились примеры кода есть делегат ParameterizedThreadStart, который как и позволяет прекрасно решить обозначенную в первом топике задачу — без всяких там замыканий, слотов и другой медвежути.
Re[3]: Многопоточность
От: Streamer1 Украина  
Дата: 15.09.06 00:42
Оценка:
Здравствуйте, ie, Вы писали:

работает


объясните плиз:
delegate { Method(str); }


что при этом реально происходит?
Тот кто знает не говорит, тот кто говорит не знает.
Re: Многопоточность
От: Streamer1 Украина  
Дата: 15.09.06 00:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object?

А>Если есть, то как?

можно так:
class TEST
{
   static public void Main()
   {
      MyThreadData td = new MyThreadData();
      td.str = "This is a test!";

      Thread t = new Thread(td.threadProc);
      t.Start();
      t.Join();
   }
   class MyThreadData
   {
      public string str;
      public void threadProc()
      {
         Console.WriteLine("{0}", str);
      }
   }
}
Тот кто знает не говорит, тот кто говорит не знает.
Re[4]: Многопоточность
От: ie Россия http://ziez.blogspot.com/
Дата: 15.09.06 06:05
Оценка:
Здравствуйте, Streamer1, Вы писали:

S>объясните плиз:

S>
S>delegate { Method(str); }
S>


S>что при этом реально происходит?


Реально компилятор генерит класс, который инкапсулирует все поля, которые используются в замыкании. Т.е. после компиляции приведенный мной код превратится примерно в следующее:
    private static void Method(string str)
    {
        Console.WriteLine(str);
    }

    private static void Main(string[] args)
    {
        Temp temp = new Temp();
        temp.str = "This is a test!";
        ThreadStart start1 = new ThreadStart(temp.Method);
        Thread thread1 = new Thread(start1);
        temp.str = "This is a second test!";
        thread1.Start();
        thread1.Join();
        Console.ReadLine();
    }
    
    private sealed class Temp
    {
        public string str;
        public void Method()
        {
            Test.Method(str);
        }
    }
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[3]: Многопоточность
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.09.06 08:26
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Да тут все еще проще. На самом деле в дотнете 2.0, на котором изначально приводились примеры кода есть делегат ParameterizedThreadStart, который как и позволяет прекрасно решить обозначенную в первом топике задачу — без всяких там замыканий, слотов и другой медвежути.


Замыкание позволяет обойтись без приведений типов.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[5]: Многопоточность
От: Streamer1 Украина  
Дата: 20.09.06 18:38
Оценка:
Здравствуйте, ie, Вы писали:

ie>Реально компилятор генерит класс, который инкапсулирует все поля, которые используются в замыкании. Т.е. после компиляции приведенный мной код превратится примерно в следующее:

ie>
...    
ie>    private sealed class Temp
ie>    {
ie>        public string str;
ie>        public void Method()
ie>        {
ie>            Test.Method(str);
ie>        }
ie>    }
ie>


хм... а я такой класс сам пишу в таких случаях
Тот кто знает не говорит, тот кто говорит не знает.
Re[6]: Многопоточность
От: ie Россия http://ziez.blogspot.com/
Дата: 21.09.06 03:04
Оценка:
Здравствуйте, Streamer1, Вы писали:

S>хм... а я такой класс сам пишу в таких случаях


ну это уже сродни разворачивания foreach в while
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.