Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 155
Текст из файла (страница 155)
цв1пс зувкеет с1авв Сцвкоытфеелпбпакеуогыаквреео ( вкакьс чобб Ма1п() ( Пакетыве бк = Пакетбее.ио; Сопвоге.нг1ке11пе("времят (О:Лпт СС)", бс)т Сопво1е.нкькеььпе("Время в 24-часовом формате: (О:НН:вкл)", бк)т Сопво1е.икгсеь1пе("дават (О:ббб МММ бб, уууу)", бс)т СОПВО1Е.НГ1каь1ПЕ("Зрат (Отдс)", бк); Сопво1е.нгькеььпе("Время в секундах: "(О:нн:лкл:вв сс)", бс)т Сопво1е.нг1ке(нпе("День месяца в формате е: (Оте)", бг)т Сопво1е.иг1ке11пе("Минуты в формате вн (Отав)", бк)т ) ) Глядя на табл.
22.8, можно заметить, что символы-заполнители б, 1, д, ы, М, в и с выполняют ту же функцию, что и аналогичные символы-заполнители из табл. 22.7. Вообще говоря, если один из этих символов указывается отдельно, то он интерпретируется как спецификатор формата. В противном случае он считается символом-заполнителем. Поэтому если требуется указать несколько таких символов отдельно, но интерпретировать их как символы-заполнители, то перед каждым из них следует поставить знак Ъ. В приведенном ниже примере программы демонстрируется применение нескольких форматов даты и времени. Глава 22.
Строки и форматирование 785 Вот к какому результату приводит выполнение этой программы (он опять же зависит от настроек языковых и региональных параметров локализации базового программного обеспечения): Время: 11:55 РН Время 24-часовен формате: 11:55 Дата: Нее Оцп 18, 2008 Эра: Л.О. Время в секундах." 11:55:52 ЬН День месяца в формате гю оцпе 18 минуты в формате гю 55 Форматирование перечислений В языке СЛ допускается также форматировать значения, определяемые в перечислении.
Вообще говоря, значения из перечисления могут отображаться как по имени, так и по значению. Спецификаторы формата перечислений сведены в табл. 22.9. Обратите особое внимание на форматы О и р. Перед перечислениями, которые должны представлять битовые поля, следует указывать атрибут р1адз. Как правило, в битовых полях хранятся значения, обозначающие отдельные двоичные разряды и упорядоченные по степени числа 2. При наличии атрибута р1адв имена всех битовых составляющих форматируемого значения, если, конечно, зто действительное значение, отображаются с помощью спецификатора С. А с помощью спецификатора р отображаются имена всех битовых составляющих форматируемого значения, если оно составляется путем логического сложения по ИЛИ двух или более полей, определяемых в перечислении.
Таблица 22.9. Спецификеторы формата перечислений Спецификатор Назначение Отображает значение в виде десятичного целого числа То же, что и 0 Отображает имя значения. Если это значение можно создать путем логического сложения по ИЛИ двух ипи более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо от того, задан атрибут 81апэ ипи нет Тоже, что и г Отображает имя значения. Если перед форматируемым перечислением указывается атрибут 81адв, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, это допустимое значение То же, что и а Отображает значение в виде шестнадцатеричного целого числа. Для отображения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями То же, что и х В приведенной ниже программе демонстрируется применение спецификаторов формата перечислений.
/! Отформатировать перечисление. цв1пд Бувгеоц ГЛАВА Многопоточное программирование реди многих замечательных свойств языка Св особое место принадлежит поддержке многопоточного программировании. Многопоточная программа состоит из двух или более частей, выполняемых параллельно. Каждая часть такой программы называется потокам и определяет отдельный путь выполнения команд. Таким образом, многопоточная обработка является особой формой многозадачности. Многопоточное программирование опирается на целый ряд средств, предусмотренных для этой цели в самом языке Св, а также на классы, определенные в среде .НЕТ Ргашечгогк. Благодаря встроенной в Сл поддержке многопоточной обработки сводятся к минимуму или вообще устраняются многие трудности, связанные с организацией многопоточной обработки в других языггах программирования.
Основы многопоточной обработки Различают две разновидности многозадачности: на основе процессов и на основе потоков. В связи с этим важно понимать отличия между ними. Процесс фактически представляет собой исполняемую программу. Нозтому многозадачностль на основе процессов — это средство, благодаря которому на компьютере могут параллельно выполняться две программы и более. Так, многозадачность на основе процессов позволяет одновременно выполнять программы текстового редактора, электронных таблиц и просмотра содержимого в Интернете.
При организации многозадачности на основе процессов программа является наименьшей единицей кода, выполнение которой может координировать планировщик задач. Поток представляет собой координируемую единицу исполняемого кода. Своим происхождением этот термин обязан понятию "поток исполнения". При организации многозадачности 'ма основе потоков у каждого процесса должен быть по крайней мере один поток, хотя их может быть и больше.
Это означает, что в одной программе одновременно может решаться две и более задачи. Например, текст может форматироваться в редакторе текста одновременно с его выводом на печать, при условии, что оба этих действия выполняются в двух отдельных потоках. 788 Часть й. Библиотека С№ Отличия в многозадачности на основе процессов и потоков могут быть сведены к следующему: многозадачность на основе процессов организуется для параллельного выполиения программ, а многозадачность на основе потоков — для параллельного выполнения отдельных частей одной программы.
Главное преимущество многопоточной обработки заключается в том, что она позволяет писать программы, которые работают очень эффективно благодаря возможности выгодно использовать время простоя, неизбежно возникающее в ходе выполнения большинства программ. Как известно, большинство устройств ввода-вывода, будь то устройства, подключеииые к сетевым портам, накопители на дисках или клавиатура, работают намного медленнее, чем центральный процессор (ЦП).
Поэтому большую часть своего времени программе приходится ожидать отправки данных на устройство ввода-вывода или приема информации из него. А благодаря многопоточной обработке программа может решать какую-нибудь другую задачу во время вынужденного простоя.
Например, в то время как одна часть программки отправляет файл через соединение с Интернетом, другая ее часть может выполнять чтение текстовой информации, вводимой с клавиатуры, а третья — осуществлять буферизацию очередного блока отправляемых данных.
Поток может находиться в одном из нескольких состояний. В целом поток может быть выполняющимся; готовым к вьтолнеяию, как только он получит время и ресурсы ЦП; лриосгпаноэленным, т.е. временно не выполняющимся; возобноаленным в дальнейшем; заблокированпым в ожидании ресурсов для своего выполнения; а также завершенным, когда его выполнение окончено и не может быть возобновлено. В среде .ХЕТ Егашетчог)с определены две разновидности потоков: приоритетный и фоновый. По умолчанию создаваемый поток автоматически становится приоритетным, но его можно сделать фоновым.
Единственное отличие приоритетных потоков от фоновых заключается в том, что фоновый поток автоматически завершается, если в его процессе остановлены все приоритетные потоки. В связи с организацией многозадачности на основе потоков возникает потребность в особого рода режиме, который называется синхронизацией и позволяет координировать выполнение потоков вполне определенным образом.
Для такой синхронизации в С№ предусмотрена отдельная подсистема, основные средства которой рассматриваются в этой главе. Все процессы состоят хотя бы из одного потока, который обычно называют основным, поскольку именно с него начинается выполнение программы. Следовательно, в основном потоке выполнялись все приведенные ранее примеры программ. Из,основного потока можно образовать другие потоки.
В языке С№ и среде .НЕТ Егашетчогтк поддерживаются обе разновидности многозадачности: иа основе процессов и на основе потоков. Поэтому средствами С№ можно создавать как процессы, так и потоки, а также управлять и теми и другими. Для того чтобы начать новый процесс, от программирующего требуется совсем немного усилий, поскольку каждый предыдущий процесс совершенно обособлен от последующего. Намного более важной оказывается поддержка в С№ многопоточной обработки, благодаря которой упрощается написание высокопроизводительных, многопоточных программ на С№ по сравнению с некоторыми другими языками программирования.
Классы, поддерживающие многопоточное программирование, определены в пространстве имен Бузоеш. тттгеабапкт. Поэтому любая многопоточная программа на С№ включает в себя следующую строку кода: озапд Зузсея.тьгеаозпот Глава 23. Многопоточное программирование 789 Класс ТЬхеаб Система многопоточной обработки основывается на классе тЬгеаг(, который инкапсулирует поток исполнения. Класс ТЬгеаг( является герметичным, т.е.
он не может наследоваться. В классе ТЬгеас( определен ряд методов и свойств, предназначенных для управления потоками. На протяжении всей этой главы будут рассмотрены наиболее употребительные члены данного класса. Для создания потока достаточно получить экземпляр объекта типа тЬгеас), т.е. класса, определенного в пространстве имен Яувгев. ТЬгеаг)1пд. Ниже приведена простейшая форма конструктора класса ТЬгеас1 рпЫ1с тпгеаг((тпгеаг(ЯСагв точка входа) где точка входа — это имя метода, вызываемого с целью начать выполнение потока, а тьгеас)Ясагс — делегат, определенный в среде .)ч(ЕТ Егзиге(чог((, как показано ниже.