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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов рекурсионной функции в потоке 
V
    Опции темы
Wanderer2019
Дата 6.7.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет...
Возник такой вопрос.. как вызвать рекурсию в потоке?

Если использовать параметризованный поток, то туда можно передать только 1 параметр (что не подходит).
Можно конечно передавать какой нибудь ArrayList, но в случае с рекурсией это не совсем подходит... как мне кажется... 

как же тогда вызывать рекурсионные функции в отдельных потоках?

Подскажите... и поправьте, если в чем то не прав.
PM ICQ MSN   Вверх
mr.DUDA
Дата 6.7.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Гм... Что надо - вызвать функцию в отдельном потоке, затем из него вызывать её же в новом потоке ? Или как ? Непонятно в чём трудности. В поток можно передать любой объект, например свой класс или структуру (юзая ParametrizedThreadStart).


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 6.7.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Цитата(Wanderer2019 @  6.7.2007,  15:33 Найти цитируемый пост)
Если использовать параметризованный поток, то туда можно передать только 1 параметр (что не подходит).
а если так? 

Код

    public class MyClass
    {
        MySubClass1 mdc1;
        MySubClass2 mdc2;
        Socket s;
        Dictionary<List<string>, Thread> IDontKnowWhatIsIt;
        public event EventHandler myEvent;
    }

    class MySubClass2
    {
    }

    class MySubClass1
    {
    }

    struct MyStruct
    {
        Type t;
        MyClass[] myClassArray;
        StreamWriter writer;
    }


......


static void Main()
{
    Thread t = new Thread(new ParameterizedThreadStart(Func));
    Dictionary<MyClass, MyStruct> dic = new Dictionary<MyClass, MyStruct>();
    dic.Add(new MyClass(), new MyStruct());
    t.Start(dic);
}

private void Func(object obj)
{//Ну вот мы и в отдельном потоке :)
   Dictionary<MyClass, MyStruct> dic = obj as Dictionary<MyClass, MyStruct>;
   if(!Equals(dic, null)){}//Разобрать полученные объекты и рекурсию в отдельном потоке можно начинать...
....
}

Подходит?  smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Wanderer2019
Дата 6.7.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05
извиняюсь за глупые вопросы.... но тогда получается, что внутри рекурсии мне нужно парсить эту структуру каждый раз...
так???
т.е.  каждый раз работая рекурсивно мне нужно собирать и передавать параметры в виде структуры из функции в функцию?

таскать за собой объект? 
я правильно понял?
PM ICQ MSN   Вверх
tol05
Дата 6.7.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



нет, зачем? Просто ты говорил, что тебя не устраивает передача только одного аргумента в поток. Ну а мы с  mr.DUDA пытаемся показать, что один аргумент - это может быть просто обертка вокруг множества самых разных объектов...
Ну а касательно моего примера (если можно его назвать примером smile) : для рекурсии бери из входных данных только то, что нужно. Ведь ты вошел в новый поток. Что-то нужно сделать в нем ДО начала рекурсии, что-то - В рекурсии, что-то - ПОСЛЕ рекурсии, но ДО выхода из потока.

И каждый из наборов этих операций может требовать отдельных данных. Так я просто тебе "рюкзачок и набыл" этими данными, чтобы в поток передать. Ну а дальше - полная свобода действий:

Код

static void Main()    
{    
    Thread t = new Thread(new ParameterizedThreadStart(Func));    
    Dictionary<MyClass, MyStruct> dic = new Dictionary<MyClass, MyStruct>();    
    dic.Add(new MyClass(), new MyStruct());    
    t.Start(dic);    
}
    
private void Func(object obj)    
{
   Dictionary<MyClass, MyStruct> dic = obj as Dictionary<MyClass, MyStruct>;    
   if(!Equals(dic, null)) 
   {
       //выбираем из dic те данные, которые нужны до рекурсии
       ...
       //выбираем из dic те данные, которые нужны для рекурсии
       Rec(...);
       //выбираем из dic те данные, которые нужны после рекурсии
       ...
   }
}

private void Rec(int i)
{
int j;
...
Rec(j);
...
};

заметь, и Func, и рекурсия (Rec) выполняются во внешнем потоке, а данные - рассосались по ф-циям smile

Это сообщение отредактировал(а) tol05 - 7.7.2007, 07:52


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Wanderer2019
Дата 7.7.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05
понятно.. спасибо...
ну т.е. получается что это то же самое, что и вызов рекурсивной функции из не рекурсивной через обычный StartThread с передачей параметров в виде глобальных переменных?
так я понимаю?

PM ICQ MSN   Вверх
tol05
Дата 7.7.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Wanderer2019, не уложняй... 
Цитата(Wanderer2019 @  7.7.2007,  12:42 Найти цитируемый пост)
 вызов рекурсивной функции из не рекурсивной
 У тебя всегда идет вызов рекурсивной из нерекурсивной. Какой бы код ты ни писал - сначала начнет выполняться нерекурсивная ф-ция, а потом где-то начнется рекурсивная. EntryPoint сборки - это ведь тоже нерекурсивная функция, правда? smile  
Цитата(Wanderer2019 @  7.7.2007,  12:42 Найти цитируемый пост)
с передачей параметров в виде глобальных переменных
 Почему глобальных? Тех же статических и экземплярных переменных, как и при работе с обычными методами, в единственном потоке. Нигде инкапсуляция членов класса не нарушается. Ты вообще можешь не передавать ничего в поток, пусть методы внутри него сами обращаются за данными к своему классу, или к статическим членам других классов....
Все то же самое, что и с одним потоком, просто гораздо быстрее  smile (если конечно есть времязатратные операции), а сама работа рекурсии одинакова, хоть с одним потоком, хоть с несколькими, вот и все.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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