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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2011, 11:36   #1
Авторитет
Пользователь
 
Регистрация: 08.04.2010
Сообщений: 74
По умолчанию Про обедающих философов

Нужно перенести код из консольной версии в winforms на listbox.

Код:
using System;
using System.Collections.Generic;
using System.Threading;

namespace Philosopher
{
    class Program
    {
        public static Semaphore Semaphore = new Semaphore(3, 3);
        static readonly List<Fork> Fork = new List<Fork>();
        static readonly List<Philosopher> Ph = new List<Philosopher>();

        static void Main()
        {
            Console.WriteLine("Введите кол-во философов: ");
            var count = Convert.ToInt32(Console.ReadLine());

            for (var i = 0; i < count; i++)
            {
                Fork.Add(new Fork());
                Ph.Add(new Philosopher((i + 1).ToString(), i));
                new Thread(Ph[i].Start).Start(Fork);
            }
        }
    }

    public class Philosopher
    {
        bool _isHunger;
        readonly string _philosopherName;
        readonly int _number;
        int _time; 

        public Philosopher(string name, int number)
        {
            _philosopherName = name;
            _number = number;
        }

        void GetFork(IList<Fork> fork)
        {
            _time = new Random().Next(System.DateTime.Now.Millisecond);

            Console.WriteLine("Философ " + _philosopherName + " ждет вилку" + "\t ({0}мс)", _time);

            var first = _number;
            var second = (_number + 1) % (fork.Count - 1);

            if (fork[first].IsUsing || fork[second].IsUsing) return;

            fork[first].IsUsing = true;
            fork[second].IsUsing = true;

            Console.WriteLine("Философ " + _philosopherName + " обедает" + "\t ({0}мс)", _time);
            Console.WriteLine("Вилки " + (first + 1) + " и " + (second + 1) + " заняты " + "\t ({0}мс)", _time);
            Thread.Sleep(_time);



            fork[first].IsUsing = false;
            fork[second].IsUsing = false;
        }

        public void Start(object obj)
        {
            while (true)
            {
                Thread.Sleep(_time);
                ChangeStatus();
                if (_isHunger)
                    GetFork((List<Fork>)obj);
            }
        }

        void ChangeStatus()
        {
            _isHunger = !_isHunger;
            if (!_isHunger)
                Console.WriteLine("Философ " + _philosopherName + " думает." + "\t ({0}мс)", _time);
        }
    }

    public class Fork
    {
        public bool IsUsing { get; set; }
    }
}
Авторитет вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Негативные анекдоты про Россию и про всё в ней происходящее... Ваше мнение? Вадим Мошев Свободное общение 16 26.09.2011 08:02
[Turbo Pascal] - задачи про подбрасывание монеты и про определение истины. Sent Tools Помощь студентам 10 28.10.2010 18:11
Вопрос про Свойство Visible и про иконки в imagelist Kappi4 Компоненты Delphi 2 21.05.2010 13:10
Реальна ли Вилка :) /*Я про букмекеров, а не про матрицу :d */ Izhic Свободное общение 14 10.11.2009 13:39
У меня вопрос про базы данных,а точнее про таблицы!!! Alexij Общие вопросы Delphi 1 13.04.2008 23:24