Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2015, 13:12   #1
Legrandes
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 16
По умолчанию Как заставить один метод ждать окончания другого ?

Всем привет! Я ранее создавал подобную тему, однако тогда я неправильно описал задачу и мало кто понял меня. В этой теме опишу все подробно и просто. Есть два метода. Каждый метод имеет несколько действий. Нужно чтобы оба метода начались одновременно и работали дальше тоже одновременно. Один из методов заканчивает работу раньше другого метода и начинает работу заново. Как сделать так, чтобы первый метод дождался окончания работы второго метода ? В итоге оба метода должны опять начать работу заново одновременно.


Код:
public static int[] red = { 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 39 };
public static int[] black = { 2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35 };
public static string win = "Вы выиграли";

static void Main(string[] args)
        {
            while (true)
            {
                krug();
            }
         Console.Read();

static void krug()
        {

            while (true)
            {
                Console.WriteLine("Ставьте 1 на Red");

                int n = int.Parse(Console.ReadLine());
                if (red.Contains(n))
                {
                    Console.WriteLine(win);
                    Console.Clear();
                    break;
                }
                else Console.WriteLine("Ставьте 2 на black");

                n = int.Parse(Console.ReadLine());
                if (black.Contains(n))
                {
                    Console.WriteLine(win);
                    Console.Clear();
                    break;
                }
             }
           }

static void krug2()
        {

            while (true)
            {
                Console.WriteLine("Ставьте 1 на black");

                int n = int.Parse(Console.ReadLine());
                if (black.Contains(n))
                {
                    Console.WriteLine(win);
                    Console.Clear();
                    break;
                }
                else Console.WriteLine("Ставьте 2 на red");

                n = int.Parse(Console.ReadLine());
                if (red.Contains(n))
                {
                    Console.WriteLine(win);
                    Console.Clear();
                    break;
                }
             }
           }
}
Как видно в коде есть два метода : krug, krug2.В обоих если происходит win , метод начинается заново. Как сделать чтобы вызывались сразу два метода ? Что прописать, чтобы один метод если закончился, ждал пока другой метод тоже закончится ( тоже дойдет до win)?
Legrandes вне форума Ответить с цитированием
Старый 17.01.2015, 13:47   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В обоих методах ввод из консоли. Каким образом вы предлагаете пользователю вводить оба "одновременно"? Как определять для какого он ввел?

Цитата:
ReleaseSemaphore.
Зачем вы постоянно заходите в раздел С# и пишите о С++? (ну или WinApi, но все равно в .NET есть более удобные аналоги)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.01.2015 в 13:50.
Alex11223 вне форума Ответить с цитированием
Старый 17.01.2015, 13:48   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Воспользуйтесь семафорами, ReleaseSemaphore.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 17.01.2015, 13:50   #4
Legrandes
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
В обоих методах ввод из консоли. Каким образом вы предлагаете пользователю вводить оба "одновременно"? Как определять для какого он ввел?
Это и нужно сделать. Пользователь вводит с клавы число. Эта инфа и будет обрабатываться всеми методами
Legrandes вне форума Ответить с цитированием
Старый 17.01.2015, 13:54   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я не спрашивал про реализацию.
С точки зрения пользователя как вы представляете такой ввод? Как это выглядеть должно?
Как ему выбрать для какого метода он хочет ввести число?

Или надо, чтоб ввел одно число и это число скармливалось всем методам?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.01.2015, 13:55   #6
Legrandes
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я не спрашивал про реализацию.

Или надо, чтоб ввел одно число и это число скармливалось всем методам?
да да,это именно и нужно
Legrandes вне форума Ответить с цитированием
Старый 17.01.2015, 14:01   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Зачем вы постоянно заходите в раздел С# и пишите о С++?
Пардон. Не заметил, что C#.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 17.01.2015, 14:34   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Код:
        private static readonly int[] Red = { 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 39 };
        private static readonly int[] Black = { 2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35 };
        private const string Win = "Вы выиграли";

        private static int Krug1Step = 1;
        private static int Krug2Step = 1;

        private static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Круг1 " + Krug1GetStatus());
                Console.WriteLine("Круг2 " + Krug2GetStatus());

                int n = int.Parse(Console.ReadLine());

                if (Krug1CheckWin(n))
                    Console.WriteLine("Круг1 " + Win);
                if (Krug2CheckWin(n))
                    Console.WriteLine("Круг2 " + Win);

                Console.WriteLine();
            }
        }

        private static string Krug1GetStatus()
        {
            switch (Krug1Step)
            {
                case 1:
                    return "Ставьте 1 на Red";
                case 2:
                    return "Ставьте 2 на Black";
                default:
                    throw new ArgumentException();
            }
        }

        private static string Krug2GetStatus()
        {
            switch (Krug2Step)
            {
                case 1:
                    return "Ставьте 1 на Black";
                case 2:
                    return "Ставьте 2 на Red";
                default:
                    throw new ArgumentException();
            }
        }

        private static bool Krug1CheckWin(int n)
        {
            switch (Krug1Step)
            {
                case 1:
                {
                    if (Red.Contains(n))
                    {
                        Krug1Step++;
                        return true;
                    }
                    else
                        return false;
                }
                case 2:
                {
                    if (Black.Contains(n))
                    {
                        Krug1Step = 1;
                        return true;
                    }
                    else
                        return false;
                }
                default:
                    throw new ArgumentException();
            }
        }

        private static bool Krug2CheckWin(int n)
        {
            switch (Krug2Step)
            {
                case 1:
                    {
                        if (Black.Contains(n))
                        {
                            Krug2Step++;
                            return true;
                        }
                        else
                            return false;
                    }
                case 2:
                    {
                        if (Red.Contains(n))
                        {
                            Krug2Step = 1;
                            return true;
                        }
                        else
                            return false;
                    }
                default:
                    throw new ArgumentException();
            }
        }
Если использовать ООП, то можно как-нибудь красивее реализовать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.01.2015, 23:15   #9
Legrandes
Пользователь
 
Регистрация: 14.04.2012
Сообщений: 16
По умолчанию

Уже ближе к тому что я хочу сделать.
Но работает не так как нужно.
"
Круг1 Ставьте 1 на Red
Круг2 Ставьте 1 на Black
2

Круг2 Вы выиграли

Круг1 Ставьте 1 на Red
Круг2 Ставьте 2 на Black

"
Первый раз мы ввели "2" с клавиатуры. Получается Black выпал и второй круг выиграл , а первый круг проиграл. Получается Следующий шаг Круг2 ничего не должен выводить а ждать пока Круг1 тоже будет Вы выиграли. А в результате Круг1 опять начал сначала ( хотя и проиграл)
Legrandes вне форума Ответить с цитированием
Старый 17.01.2015, 23:25   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

У круга2 после выигрыша должно быть написано Red, а не Black.

Цитата:
Получается Следующий шаг Круг2 ничего не должен выводить а ждать пока Круг1 тоже будет Вы выиграли.
Цитата:
А в результате Круг1 опять начал сначала
Что-то я не понял как это не противоречит друг другу.
Если круг2 ждет, то что тогда в круге1 должно быть? Первый шаг же?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.01.2015 в 23:37.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заставить функцию ждать? phasha Помощь студентам 6 15.04.2012 20:57
как не ждать окончания процедуры(функции)? Кольша Общие вопросы Delphi 14 02.02.2012 16:49
Как вставить диапазоны ячеек из разных файлов в один, но так чтобы они шли один ниже другого? Squarded Microsoft Office Excel 4 24.07.2011 19:24
Подскажите, как в консольном приложении заставить программу ждать нажатия клавиши(си)) Александр Елис Помощь студентам 2 19.09.2009 19:38
Как вычесть один диапазон из другого? viter.alex Microsoft Office Excel 11 20.01.2009 16:30