C # // Как заставить работать несколько циклов одновременно? - PullRequest
0 голосов
/ 23 января 2012

Я программировал консольные приложения в течение 1 года, и я думаю, что пришло время начать что-то с формами. Я действительно не знаю, как заставить 2 цикла работать одновременно.

Может ли что-нибудь1 помочь мне и привести пример двух циклов, работающих вместе (1 - от 1 до 100 и 2 - от 100 до 200 (оба одновременно, скажем, 2 окна сообщения)). Я искал что-то подобное в сети, но безуспешно.

Я также хотел бы знать, должен ли бесконечный whiles походить на while (5> 2) или есть лучший способ сделать это.

Заранее спасибо!

Ответы [ 4 ]

12 голосов
/ 23 января 2012

Я действительно не знаю, как заставить 2 цикла работать одновременно.

Это простой вопрос с огромным ответом, но я постараюсь разбить его для вас.

Проблема, которую вы описываете на базовом уровне: «У меня есть два разных куска кода, которые так или иначе взаимодействуют с пользователем. Я хотел бы создать у пользователя впечатление, что оба куска кода выполняются на в то же время плавно реагирует на ввод пользователя. "

Очевидно, что самый простой способ сделать это - написать две программы . То есть заставит операционную систему решить проблему . В операционной системе каким-то образом удается одновременно запускать десятки различных процессов, все из которых гладко (мы надеемся) взаимодействуют с пользователем.

Но наличие двух процессов требует больших затрат. Процессы тяжеловесны, и два куска кода обходятся дорого. Предположим, что вы хотите иметь два куска кода в одной программе . Теперь, что ты делаешь?

Один из способов - поместить два фрагмента кода каждый в отдельный поток в одном и том же процессе. Это кажется хорошей идеей, но создает много собственных проблем. Теперь вам нужно беспокоиться о безопасности потоков, взаимоблокировках и прочем. И, к сожалению, разрешено общаться только одному потоку с пользователем . Каждое приложение формы имеет поток "UI". Если у вас есть два «рабочих» потока, выполняющих ваши фрагменты кода, они должны использовать межпотоковое взаимодействие для связи с потоком пользовательского интерфейса.

Другой способ состоит в том, чтобы разбить каждый кусок кода на крошечные маленькие кусочки, а затем запланировать все куски для выполнения по порядку в потоке пользовательского интерфейса. Планировщик может отдавать приоритет взаимодействию с пользователем, и любая конкретная крошечная часть работы не будет блокировать и не отвечать потоку пользовательского интерфейса.

Это последняя техника, которую я бы предложил вам изучить. Мы делаем много работы в C # 5, чтобы было легче писать программы в этом стиле.

См. http://msdn.microsoft.com/en-us/async для получения дополнительной информации об этой новой функции.

0 голосов
/ 23 января 2012

Не уверен, что вы имеете в виду эти две петли.

Бесконечные циклы - это все, где while (expression is true), где ваше выражение 5>2 всегда возвращает истину, и нет завершения из цикла, т.е. return; или break;

0 голосов
/ 23 января 2012

Добавьте две метки на форму в режиме конструктора.А затем добавьте это в представлении «Код»:

public Form1()
{
    InitializeComponent();
    Shown += new EventHandler(Form1_Shown);
}

void Form1_Shown(object sender, EventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        label1.Text = i.ToString();

        // "Second loop"
        label2.Text = (i + 100).ToString();

        Update();
        System.Threading.Thread.Sleep(10);
    }
}

Вы получите два числа, считая одновременно.Один из 1-100.Другой от 101-200.

0 голосов
/ 23 января 2012

Это?

for (int i = 1; i <= 100; i++)
{
    //..
    for (int i2 = 100; i2 <= 200; i2++)
    {
        //..
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...