<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Win 32-эфффективная разработка приложений</title>
	<atom:link href="http://efrazrabotka.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://efrazrabotka.ru</link>
	<description>Программирования для Windows на языке С/С++ с применением Win32</description>
	<lastBuildDate>Sun, 05 Sep 2010 15:34:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Побочные эффекты успешного ожидания</title>
		<link>http://efrazrabotka.ru/267/</link>
		<comments>http://efrazrabotka.ru/267/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 15:34:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/267/</guid>
		<description><![CDATA[Успешный вызов функции WaitForSingleObject или WaitForMuttipleObjects на самом деле меняет состояние некоторых объектов ядра. Успешным считается такой вызов, который завершается освобождением соответствующего объекта или объектов. При этом функция возвращает значение WAIT_OBJECT_0 или значение, являющееся смещением относительно WAIT_OBJECT_0. Вызов считается неудачным, если возвращается значение WAIT_TIMEOUT или WAIT_FAILED. В этом случае состояние каких-либо объектов не меняется.
Пусть, например, [...]]]></description>
			<content:encoded><![CDATA[<p>Успешный вызов функции WaitForSingleObject или WaitForMuttipleObjects на самом деле меняет состояние некоторых объектов ядра. Успешным считается такой вызов, который завершается освобождением соответствующего объекта или объектов. При этом функция возвращает значение WAIT_OBJECT_0 или значение, являющееся смещением относительно WAIT_OBJECT_0. Вызов считается неудачным, если возвращается значение WAIT_TIMEOUT или WAIT_FAILED. В этом случае состояние каких-либо объектов не меняется.<br />
Пусть, например, поток вызвал функцию WaitForSingleObject и ждет освобождения объекта «событие с автосбросом» (объекты-события рассматриваются в следующем разделе). Когда объект переходит в свободное состояние, функция обнаруживает это и возвращает значение WAIT_OBJECT_0. Но перед самым возвратом из функции объект-событие будет переведен в занятое состояние. Это и есть побочный эффект успешного ожидания.<br />
Объекты ядра «событие с автосбросом» ведут себя подобным образом, потому что таково одно из правил, определенных Microsoft для объектов этого типа. Другие объекты дают иные побочные эффекты, а некоторые — вообще никаких. К последним относятся объекты ядра «процесс» и «поток».</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/267/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wait-функции</title>
		<link>http://efrazrabotka.ru/266/</link>
		<comments>http://efrazrabotka.ru/266/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 15:31:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/266/</guid>
		<description><![CDATA[Многие объекты ядра могут находиться либо в свободном {signaled state), либо
в занятом состоянии (nonsignaled state). К таким объектам относятся:
 процессы;
  потоки;
  задания;
 файлы;
  консольный ввод;
уведомления об изменении файлов;
   события;
   ожидаемые таймеры;
   семафоры;
   мьютексы.
Wait-функции позволяют потоку в любой момент приостановиться и ждать освобождения какого-либо объекта [...]]]></description>
			<content:encoded><![CDATA[<p>Многие объекты ядра могут находиться либо в свободном {signaled state), либо<br />
в занятом состоянии (nonsignaled state). К таким объектам относятся:<br />
 процессы;<br />
  потоки;<br />
  задания;<br />
 файлы;<br />
  консольный ввод;<br />
уведомления об изменении файлов;<br />
   события;<br />
   ожидаемые таймеры;<br />
   семафоры;<br />
   мьютексы.<br />
Wait-функции позволяют потоку в любой момент приостановиться и ждать освобождения какого-либо объекта ядра. Важным свойством функций этого семейства является то, что они не тратят процессорное время, пока ждут освобождения объекта или наступления тайм-аута.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/266/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обмен данными между процессами</title>
		<link>http://efrazrabotka.ru/269/</link>
		<comments>http://efrazrabotka.ru/269/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 15:35:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/269/</guid>
		<description><![CDATA[Потоки одного процесса не имеют доступа к адресному пространству другого процесса. Однако существуют специализированные механизмы для передачи данных между процессами. Вообще обмен данными между процессами (Interprocess Communication, IPC) в свое время начинался в виде процедуры перемещения перфокарт из выходного отверстия одного вычислительного устройства в устройство чтения другого вычислительного устройства. Позже, с развитием операционных систем, обмен [...]]]></description>
			<content:encoded><![CDATA[<p>Потоки одного процесса не имеют доступа к адресному пространству другого процесса. Однако существуют специализированные механизмы для передачи данных между процессами. Вообще обмен данными между процессами (Interprocess Communication, IPC) в свое время начинался в виде процедуры перемещения перфокарт из выходного отверстия одного вычислительного устройства в устройство чтения другого вычислительного устройства. Позже, с развитием операционных систем, обмен данными между процессами проделал определенный путь в сторону высоких технологий. Наиболее впечатляющим примером обмена информацией является создание Всемирной паутины (World Wide Web). Приведем краткий список механизмов IPC, встроенных в Windows:<br />
   Буфер обмена (clipboard) — одна из самых примитивных и хорошо известных форм IPC. Основная его задача состоит в поддержке обмена данными между программами по желанию и под контролем пользователя.<br />
   Библиотеки динамической компоновки. Когда в рамках DLL объявляется переменная, то ее можно сделать разделяемой (shared). Все процессы из DLL, обращающиеся к такой переменной, будут использовать одно и то же место в физической памяти.<br />
Сообщение WM_COPYDATA, которое применяется для передачи участка памяти другому процессу.<br />
 Разделяемая память (shared memory) реализуется при помощи объектов ядра «проекция файла», которые осуществляют отображение файлов на оперативную память.<br />
 Протокол динамического обмена данными (Dynamic Data Exchange, DDE), который определяет все основные функции для обмена данными между приложениями. DDE широко использовался до тех пор, пока Microsoft не приняла решение использовать OLE, которую затем переименовали в ActiveX, в качестве основной технологии взаимодействия программ.<br />
   Удаленный вызов процедур (Remote Procedure Call, RPC), строго говоря, не является механизмом IPC. Это скорее, технологическая оболочка, расширяющая возможности традиционных механизмов IPC. Благодаря RPC сеть становится совершенно прозрачной как для сервера, так и для клиента.<br />
 ActiveX является универсальной технологией, и одним из ее применений является обмен данными между процессами. Специально для этой цели Microsoft определила стандартный интерфейс IDataObject А для обмена данными по сети используется Distibuted Component Object Model (DCOM), которую можно рассматривать как объединение ActiveX и RPC.<br />
 Каналы (pipes) — мощная технология обмена данными. В общем случае канал можно представить в виде трубы, соединяющей два процесса, через которую идет непрерывный поток данных. Каналы делятся на анонимные (anonymous pipes) и именованные (named pipes). Анонимные каналы используются довольно редко. Именованные каналы, которые поддерживаются только в системах WinNT/2000, передают произвольные данные и могут работать через сеть. В последнее время вместо именованных каналов все чаще используют сокеты.<br />
   Сокеты (sockets) — очень важная технология, так как именно она отвечает за обмен данными в сети Интернет. Сокеты также часто используются в крупных локальных сетях. Сокеты можно рассматривать как «разъемы», представляющие собой абстракцию конечных точек коммуникационной линии, которая соединяет два приложения. Windows содержит достаточно мощный API для работы с сокетами.<br />
   Почтовые слоты (mailslots) — это механизм однонаправленного IPC. Если приложению известно имя слота, то оно может помещать туда сообщения, а приложение, которое является владельцем этого слота, может их оттуда извлекать и обрабатывать. Основное преимущество этого способа заключается в возможности передавать сообщения по локальной сети сразу нескольким компьютерам за одну операцию, если, конечно, несколько приемников имеют почтовые слоты с одним и тем же именем.<br />
   Microsoft Message Queue (MSMQ) — обеспечивает посылку сообщений между приложениями с помощью очереди сообщений. В отличие от других форм IPC, эта технология позволяет посылать сообщения процессу, который в данное время недоступен, например, если приложение не запущено, сервер вышел из строя или сетевой канал связи перегружен. Механизм MSMQ ставит сообщение в очередь до тех пор, пока не появится возможность переслать его адресату.<br />
В данной книге будут рассмотрены только два механизма обмена данными между процессами: обмен с помощью разделяемой памяти (или объекта ядра «проекция файла») и обмен при помощи сообщения WM_COPYDATA.<br />
Но сначала — несколько слов об архитектуре памяти Win32.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/269/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Физическая память и страничный файл</title>
		<link>http://efrazrabotka.ru/271/</link>
		<comments>http://efrazrabotka.ru/271/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 15:45:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/271/</guid>
		<description><![CDATA[Так как на современных компьютерах оперативная память RAM имеет размеры, по крайней мере, на порядок меньше 4 Гбайт, то система имитирует задекларированную память за счет дискового пространства. При этом на диске создается страничный файл (page file), который вместе с физической памятью RAM образует виртуальную память, доступную всем процессам. Другое название страничного файла — файл подкачки [...]]]></description>
			<content:encoded><![CDATA[<p>Так как на современных компьютерах оперативная память RAM имеет размеры, по крайней мере, на порядок меньше 4 Гбайт, то система имитирует задекларированную память за счет дискового пространства. При этом на диске создается страничный файл (page file), который вместе с физической памятью RAM образует виртуальную память, доступную всем процессам. Другое название страничного файла — файл подкачки (swap file).<br />
Процессор сам управляет отображением виртуальных адресов из машинных команд в эквивалентные физические адреса в ходе выполнения команды. Осуществляя это отображение, процессор оперирует страницами памяти размером 4 Кбайта. Этот же размер страниц используется Windows для управления виртуальной памятью.<br />
Теперь посмотрим, что происходит, когда поток пытается получить доступ к блоку данных в адресном пространстве своего процесса. В этом случае возможны три ситуации:<br />
   Данные, к которым обращается поток, находятся в оперативной памяти. Тогда процессор проецирует виртуальный адрес данных на физический, и поток получает доступ к этим данным.<br />
   Данные отсутствуют в оперативной памяти, но размещены где-то в страничном файле. Попытка доступа к данным генерирует прерывание, называемое Page Fault (Ошибка страницы). Тогда система начинает искать свободную страницу в оперативной памяти. Если такой страницы нет, то система вынуждена освободить одну из занятых страниц. Если занятая страница не модифицировалась, она просто освобождается. В ином случае она сначала копируется из оперативной памяти в страничный файл. После этого система отыскивает в страничном файле запрошенный блок данных, загружает этот блок на свободную страницу оперативной памяти и, наконец, проецирует виртуальный адрес данных на соответствующий адрес в физической памяти.<br />
   Иногда из-за программной ошибки или сбоя в аппаратной части требуемая страница отсутствует и в оперативной памяти, и в страничном файле. Тогда система генерирует ошибку Invalid Page Fault, и работающее приложение закрывается.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/271/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Архитектура интерфейсов (API) управления памятью</title>
		<link>http://efrazrabotka.ru/272/</link>
		<comments>http://efrazrabotka.ru/272/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 15:45:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/272/</guid>
		<description><![CDATA[Диспетчер виртуальной памяти (Virtual Memory Manager — VMM) является составной частью ядра операционной системы. Он отображает виртуальные адреса на физические, используя механизм подкачки страниц памяти (page swapping). Кроме того, он предоставляет прикладным программам различные интерфейсы (API) для работы с виртуальной памятью:
   Virtual Memory API — набор функций, позволяющих приложению работать с виртуальным адресным [...]]]></description>
			<content:encoded><![CDATA[<p>Диспетчер виртуальной памяти (Virtual Memory Manager — VMM) является составной частью ядра операционной системы. Он отображает виртуальные адреса на физические, используя механизм подкачки страниц памяти (page swapping). Кроме того, он предоставляет прикладным программам различные интерфейсы (API) для работы с виртуальной памятью:<br />
   Virtual Memory API — набор функций, позволяющих приложению работать с виртуальным адресным пространством. Например, функции VirtualAlloc и VirtualFree позволяют процессу получать страницы из памяти или возвращать их системе.<br />
   Memory Mapped File API — набор функций, позволяющих работать с файлами, проецируемыми в память. Это новый механизм, предоставляемый Windows для работы с файлами и взаимодействия процессов.<br />
Heap Memory API — набор функций, позволяющих работать с динамически распределяемыми областями памяти (кучами).</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/272/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Файлы данных, проецируемые в память</title>
		<link>http://efrazrabotka.ru/273/</link>
		<comments>http://efrazrabotka.ru/273/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 15:46:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/273/</guid>
		<description><![CDATA[Проецирование файла данных в адресное пространство процесса предоставляет разработчику мощный механизм работы с файлами. Спроецировав файл на адресное пространство процесса, программа получает возможность работать с ним, как с массивом. Это очень удобно при манипуляциях с большими потоками данных. Для проецирования файла в память необходимо выполнить три операции:
1.   Создать объект ядра «файл», идентифицирующий дисковый [...]]]></description>
			<content:encoded><![CDATA[<p>Проецирование файла данных в адресное пространство процесса предоставляет разработчику мощный механизм работы с файлами. Спроецировав файл на адресное пространство процесса, программа получает возможность работать с ним, как с массивом. Это очень удобно при манипуляциях с большими потоками данных. Для проецирования файла в память необходимо выполнить три операции:<br />
1.   Создать объект ядра «файл», идентифицирующий дисковый файл, который вы хотите использовать как проецируемый в память (функция CreateFile).<br />
2.   Создать объект ядра «проекция файла» при помощи функции CreateFileMapping. При этом используется дескриптор файла, возвращенный функцией CreateFile.<br />
3.   Указать отображение объекта «проекция файла» или его части на адресное пространство процесса (функция MapViewOfFile).<br />
Закончив работу с проецируемым в память файлом, тоже следует выполнить три операции:<br />
1.   Отменить отображение на адресное пространство процесса объекта «проекция файла» (функция UnmapViewOfFile).<br />
2.   Закрыть объект ядра «проекция файла».<br />
3.   Закрыть объект ядра «файл».<br />
Описанную технологию можно проиллюстрировать следующим фрагментом кода:<br />
HANDLE hFile.  hFileMapping:<br />
PVOID pArray;<br />
hFile = CreateFileC'File Name",   ...   );<br />
hFileMapping = CreateFileMapping(hFile,   ...   ):<br />
CloseHandle(hFile)   :<br />
pArray - MapViewOfFile(hFileMapping.   ...   );<br />
CloseHandle(hFileMapping)   ;<br />
//<br />
/ Работаем с файлом, как с массивом рАггау /<br />
//<br />
UnmapVi ewOfFi1е(pArray);<br />
В этом примере «закрывающие» операции выполняются сразу после использования соответствующего дескриптора объекта. Это уменьшает вероятность утечки ресурсов.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/273/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Использование проекции файла для реализации разделяемой памяти</title>
		<link>http://efrazrabotka.ru/274/</link>
		<comments>http://efrazrabotka.ru/274/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 15:46:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Многозадачность]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/274/</guid>
		<description><![CDATA[Самый низкоуровневый механизм совместного использования данных в одной системе — проецирование файла в память. На нем так или иначе базируются все другие механизмы разделения данных. Поэтому, если вы хотите получить максимальное быстродействие с минимумом издержек, лучше всего применять именно проецирование.
Совместное использование данных в этом случае происходит по следующей схеме. Несколько процессов проецируют в память представления [...]]]></description>
			<content:encoded><![CDATA[<p>Самый низкоуровневый механизм совместного использования данных в одной системе — проецирование файла в память. На нем так или иначе базируются все другие механизмы разделения данных. Поэтому, если вы хотите получить максимальное быстродействие с минимумом издержек, лучше всего применять именно проецирование.<br />
Совместное использование данных в этом случае происходит по следующей схеме. Несколько процессов проецируют в память представления одного и того же объекта «проекция файла», то есть делят одни и те же страницы физической памяти. Поэтому, когда один процесс записывает данные в представление общего объекта «проекция файла», эти изменения немедленно отражаются в других процессах. Но для этого все процессы должны использовать одинаковое имя объекта «проекция файла».<br />
В предыдущем разделе рассматривалось проецирование представления файла, размещенного на диске. Но для целей обмена данными между разными процессами хранение этих данных на диске было бы очень неудобным. К счастью, Win32 API предусматривает возможность проецирования файлов непосредственно на физическую память из страничного файла, а не из специально создаваемого дискового файла.<br />
Этот способ даже проще стандартного, рассмотренного в предыдущем разделе. Во-первых, не нужно вызывать функцию CreateFile. Вы просто вызываете функцию CreateFileMapping и передаете значение INVALID_HANDLE_VALUE (или константу -1) в параметре hFile. Но при вызове функции CreateFileMapping следует передать в последнем ее параметре С-строку, содержащую имя этого объекта. Тогда другие процессы, если им понадобится доступ к разделяемой памяти, смогут вызвать функцию OpenFileMapping и передать ей то же самое имя.<br />
Учтите, что если разделяемая память используется в режиме записи данных более чем одним потоком, то вы должны предусмотреть синхронизацию работы этих потоков. Пример такой синхронизации при помощи объектов-событий рассматривается чуть ниже.<br />
Когда работа с объектом «проекция файла» завершена, процесс должен вызвать функцию CloseHandle. Как только все дескрипторы объекта будут закрыты, система освободит память, переданную из страничного файла.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/274/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Таймеры и время</title>
		<link>http://efrazrabotka.ru/276/</link>
		<comments>http://efrazrabotka.ru/276/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 15:46:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Таймеры и время]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/276/</guid>
		<description><![CDATA[При решении некоторых задач программа должна отслеживать текущее время или выполнять какие-либо действия с определенной периодичностью. Например, эта проблема возникает в приложениях, имитирующих аппаратуру, работающую в реальном масштабе времени, в игровых и мультимедийных приложениях, а также при проведении различных тестов. Кроме того, иногда требуется отладить критичные ко времени исполнения фрагменты кода, для чего нужен «хронометр» [...]]]></description>
			<content:encoded><![CDATA[<p>При решении некоторых задач программа должна отслеживать текущее время или выполнять какие-либо действия с определенной периодичностью. Например, эта проблема возникает в приложениях, имитирующих аппаратуру, работающую в реальном масштабе времени, в игровых и мультимедийных приложениях, а также при проведении различных тестов. Кроме того, иногда требуется отладить критичные ко времени исполнения фрагменты кода, для чего нужен «хронометр» с высокой разрешающей способностью.<br />
Win32 API содержит как функции для измерения текущего времени, так и функции для создания виртуальных таймеров — устройств, извещающих приложение об истечении заданного интервала времени. Для успешного применения этих программных средств необходимо учитывать их разрешающую способность и потенциальную точность измерения.<br />
Важно понимать, что многозадачная операционная система Windows не является системой реального времени, поэтому любой виртуальный таймер в Windows не может гарантировать какой бы то ни было фактической точности отсчета временного интервала. Ведь в любой момент времени система может прервать выполнение вашего приложения, чтобы дать возможность поработать другому приложению (простой, вызванный прерыванием, чаще всего длится от 1 до 30 мс1). Вероятность таких прерываний тем ниже, чем меньше рассматриваемый временной интервал и чем меньше других программ работает одновременно с вашим приложением. В то же время, как показывают эксперименты, мультимедийный таймер Windows обеспечивает вполне приемлемую фактическую точность отсчета временных интервалов для многих задач.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/276/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Системное время</title>
		<link>http://efrazrabotka.ru/278/</link>
		<comments>http://efrazrabotka.ru/278/#comments</comments>
		<pubDate>Sat, 29 May 2010 15:47:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Таймеры и время]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/278/</guid>
		<description><![CDATA[Системное время в Windows содержит информацию о текущих дате и времени и представляет собой так называемое UTC-время (Universal Time Coordinated). Время в формате UTC основывается на среднем времени по Гринвичу. Системное время может быть получено при помощи функции GetSystemTime:
VOID GetSystemTimeCLPSYSTEMTIME lpSystemTime);
Функция записывает результат в структуру типа SYSTEMTIME, адрес которой задается параметром lpSystemTime. Структура типа SYSTEMTIME [...]]]></description>
			<content:encoded><![CDATA[<p>Системное время в Windows содержит информацию о текущих дате и времени и представляет собой так называемое UTC-время (Universal Time Coordinated). Время в формате UTC основывается на среднем времени по Гринвичу. Системное время может быть получено при помощи функции GetSystemTime:<br />
VOID GetSystemTimeCLPSYSTEMTIME lpSystemTime);<br />
Функция записывает результат в структуру типа SYSTEMTIME, адрес которой задается параметром lpSystemTime. Структура типа SYSTEMTIME содержит поля для года, месяца, дня недели, дня, часов, минут, секунд и миллисекунд.<br />
Так как системное время отсчитывается по Гринвичу, то, скорее всего, оно не совпадает с местным временем, которое отображается на панели задач. Получить значение местного времени можно при помощи функции GelLocalTime, которая возвращает информацию в том же формате, что и функция GetSystemTime. Если вы считаете, что ваше приложение может изменять системное время, то это можно осуществить при помощи вызова функции SetSystemTime или SetLocalTime. В некоторых случаях может оказаться полезной пара функций, работающих с информацией о часовом поясе, — GetTimeZonelnformation и SetTimeZonelnformation.<br />
Системное время считывается с часов реального времени, встроенных в компьютер и имеющих автономное питание, в момент запуска Windows. Затем операционная система обеспечивает приращения системного времени, используя прерывания системного таймера, аналогично управлению временем Windows. Таким образом, точность измерения времени с помощью GetSystemTime также определяется разрешением системного таймера.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/278/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Программирование задержек в исполнении кода</title>
		<link>http://efrazrabotka.ru/280/</link>
		<comments>http://efrazrabotka.ru/280/#comments</comments>
		<pubDate>Tue, 11 May 2010 15:48:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Таймеры и время]]></category>

		<guid isPermaLink="false">http://efrazrabotka.ru/280/</guid>
		<description><![CDATA[При создании реальных программ часто возникает необходимость «притормозить» исполнение кода в том или ином месте программы. В качестве простейшего примера можно привести игровую программу, перемещающую некий графический объект по экрану с помощью цикла while. Предположим, что вы отладили вашу программу на компьютере с процессором, имеющим тактовую частоту 500 МГц. Что произойдет, если эта программа будет [...]]]></description>
			<content:encoded><![CDATA[<p>При создании реальных программ часто возникает необходимость «притормозить» исполнение кода в том или ином месте программы. В качестве простейшего примера можно привести игровую программу, перемещающую некий графический объект по экрану с помощью цикла while. Предположим, что вы отладили вашу программу на компьютере с процессором, имеющим тактовую частоту 500 МГц. Что произойдет, если эта программа будет исполняться на более мощном компьютере с тактовой частотой процессора 2 ГГц? Если не предусмотреть специальных мер, то объект будет двигаться гораздо быстрее, и не исключено, что играть станет совершенно невозможно. Типичное решение проблемы заключается в определении характеристик процессора и добавлении программируемых задержек в таких циклах. Другой пример, с которым мы столкнулись совсем недавно, —использование программируемой задержки для калибровки счетчика меток реального времени в классе KTimer.</p>
]]></content:encoded>
			<wfw:commentRss>http://efrazrabotka.ru/280/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
