Многопоточное программирование - PullRequest
0 голосов
/ 09 июля 2011

У меня есть задача. У меня есть какое-то случайное число, которое содержит значение этого числа и задержку.

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

И все, что мне нужно сделать, это следующее: например, у меня есть 5 номеров. Все они находятся в одной форме. Поэтому, когда программа запускается, она должна взять первый номер, получить его задержку, сделать что-то вроде Thread.Sleep (delay) для этого номера, обновить его, затем получить второй номер, получить задержку и так далее. Когда он достигает последнего, он должен снова получить первый номер, затем второй и так далее. Как петля.

Я новичок в темах. Так может кто-нибудь объяснить мне, как это должно работать?

Итак, у меня есть основная форма, затем у меня есть 5 пользовательских элементов управления (я храню их в списке <>). Каждый элемент управления имеет метод UpdateNumber (), который обновляет значение и задержку текущего номера. Что я должен делать в основной форме? Нужно ли создавать массив Thread []? Тогда поместите каждый UserControl там? Затем запустите их все и как-нибудь их проконтролируйте?

Я думаю, что-то о Thread.Join. Но для меня, как и для новичка, это довольно сложно.

P.S. и чем мне нужно следующее задание. То же самое, но все эти цифры работают отдельно. Например, первые числа имеют 5 секундную задержку в начале. Когда он достигает 5 секунд задержки, это само обновление. Второй номер и все остальные делают то же самое.

Ответы [ 2 ]

2 голосов
/ 09 июля 2011

Я бы не стал создавать темы и использовать Thread.Sleep(). Каждый поток является дорогим ресурсом для создания, и, поскольку он большую часть времени будет спать, он будет потрачен впустую большую часть времени. Кроме того, когда он выполняется, это может вызвать переключение контекста, так как процессоры могут быть насыщенными.

Вместо этого я бы рассмотрел использование System.Threading.Timer. Например, вы изначально установили Timer для работы с первым значением. После завершения этой операции вы используете «задержку» для установки Timer для выполнения кода, который будет считывать следующее значение, используя Timer.Change() и так далее. Я не уверен, что полностью понимаю ваши требования, но, похоже, вы сможете удовлетворить большинство из них, используя Timer. Timer будет использовать ThreadPool, что позволит избежать ненужного создания потока и переключения контекста.

Чтобы узнать больше о многопоточности, я настоятельно рекомендую книгу Джеффри Рихтера CLR через C # (часть V). Многопоточность очень мощная, но совершенно легко ошибиться. ИМХО любой, кто хочет писать многопоточный код, должен хотя бы прочитать хороший текст, такой как этот, прежде чем начинать.

0 голосов
/ 10 июля 2011

Основываясь только на том, что я прочитал, я не вижу никаких веских причин использовать потоки вообще. Я имею в виду, что вы просто генерируете разные случайные числа, основанные на некотором временном интервале, поэтому это не может быть слишком интенсивным процессором. Просто используйте System.Windows.Forms.Timer в каждом UserControl. Когда обработчик события Tick выполняется, просто сгенерируйте следующее число.

Если вы спрашиваете, будет ли хорошей идеей запускать каждый UserControl в отдельном потоке, тогда ответ, безусловно, будет отрицательным. Все элементы пользовательского интерфейса, включая Form и Control, должны выполняться в специально назначенном потоке пользовательского интерфейса. Это обязательно. Он не будет работать правильно (или вообще) на свободной ветке.

По поводу звонка Thread.Join; не пытайтесь сделать это, по крайней мере, в потоке пользовательского интерфейса в любом случае. Вызов Join в потоке пользовательского интерфейса заблокирует механизмы диспетчеризации сообщений Windows. Это будет выглядеть так, как будто весь пользовательский интерфейс завис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...