Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > вызов рекурсионной функции в потоке


Автор: Wanderer2019 6.7.2007, 15:33
Всем привет...
Возник такой вопрос.. как вызвать рекурсию в потоке?

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

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

Подскажите... и поправьте, если в чем то не прав.

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

Автор: tol05 6.7.2007, 21:57
Цитата(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 

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

таскать за собой объект? 
я правильно понял?

Автор: tol05 6.7.2007, 23:31
нет, зачем? Просто ты говорил, что тебя не устраивает передача только одного аргумента в поток. Ну а мы с  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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)