Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП. Часть 2. Контрольная работа 2.doc
Скачиваний:
96
Добавлен:
01.04.2014
Размер:
190.98 Кб
Скачать
    1. Приостановка и возобновление выполнения потока

Поток может быть приостановлен функцией SuspendThread. Это значит, что потоку не будет выделятся процессорного времени. Поток может приостановить себя сам, но возобновить работу потока может только другой (не приостановленный) поток. Для возобновления работы потока используется функция ResumeThread.

Система ведёт счётчик приостановок потока. Это значит, что, вызвав функцию приостановки потока n раз, так же n раз должна быть вызвана функция возобновления работы потока.

Пример 4. Программа приостанавливает и возобновляет работу потока, выполняющего бесконечный цикл

#include <windows.h>

#include <iostream>

// Функция потока с бесконечным циклом

DWORD __stdcall Loop(LPVOID lpParam)

{

  for(;;);

  return 0;

}

int main(int argc, char* argv[])

{

   HANDLE hThread; // Описатель потока

   // Запуск потока с бесконечным циклом

   hThread = CreateThread(NULL, 0, Loop, NULL, 0, NULL);

   // Вывод меню

   std::cout << "нажмите s для приостановки работы потока" <<  std::endl;

   std::cout << "нажмите r для возобновления работы потока" << std::endl;

   std::cout << "нажмите t для остановки потока и выхода из программы" << std::endl;

   char KeyPressed = '\0';

   while (KeyPressed != 't')

   {

     cin >> KeyPressed;

     switch (KeyPressed)

     {

        case 's'’: SuspendThread(hThread); break;

        case 'r': ResumeThread(hThread); break;

     }

   }

   // Прерываем поток

   TerminateThread(hThread);

   // Закрываем описатель потока. (Не забываем!!!)

   CloseHandle(hThread);

   return 0;

}

  1. Файл

Модель системы ввода-вывода Windows согласуется с концепцией большинства ОС, где все устройства представлены прикладному программисту как файл. ОС пытается, насколько это, возможно, скрыть от разработчиков различия между устройствами. Открыв устройство, вы используете одни и те же функции для чтения и записи независимо от того, с каким устройством вы обмениваетесь информацией.

Для осуществления ввода-вывода, прежде всего надо открыть устройство и получить его описатель. Способ получения описателя зависит от типа устройства, но, как правило, используется функция CreateFile.

Объект ядра “файл”

Объект ядра “файл” создаётся функцией CreateFile, которая позволяет создавать и открывать дисковые файлы, а так же открывать другие типы устройств. Ниже рассмотрен синтаксис функции применительно к созданию дисковых файлов. Полное описание функции можно получить в MSDN.

HANDLE CreateFile(

  LPCTSTR lpFileName, // Имя файла

  DWORD dwDesiredAccess, // Режим доступа

  DWORD dwShareMode, // Режим разделения

  LPSECURITY_ATTRIBUTES lpSecurityAttributes,// Дескриптор защиты

  DWORD dwCreationDisposition, // Параметры создания

  DWORD dwFlagsAndAttributes, // Атрибуты файла

  HANDLE hTemplateFile // Описатель шаблона

);

LPCTSTR lpFileName указывает тип и имя устройства. Для дисковых файлов указывается полный путь либо UNC путь. Максимальная длина пути равна MAX_PATH (260), однако можно преодолеть это ограничение, указав перед именем “\\?\” это позволит указать имя в формате UNICODE, длиной до 32 000 символов, но каждый компонент пути ограничен MAX_PATH.

DWORD dwDesiredAccess определяет, как будет производиться обмен данными с устройством.

0 – Считывание или запись на устройство производиться не будут. Файл открыт только для изменения конфигурационных параметров устройства.

GENERIC_READ – Разрешает доступ к устройству только для чтения

GENERIC_WRITE – Разрешает доступ к устройству только для записи

GENERIC_READ|GENERIC_WRITE – Разрешает доступ для чтения и записи.

DWORD dwShareMode определяет привилегии при совместном доступе к устройству.

0 – Требуется монопольный доступ к устройству

FILE_SHARE_READ – Другие процессы не могут записывать на устройство

FILE_SHARE_WRITE – Другие процессы не могут читать с устройства

FILE_SHARE_READ|FILE_SHARE_WRITE – Другие процессы могут и писать и читать с устройства

LPSECURITY_ATTRIBUTES lpSecurityAttributes – дескриптор защиты, который применим только в файловой системе NTFS. Для защиты по умолчанию NULL.

DWORD dwCreationDisposition задаёт параметры открытия дисковых файлов

CREATE_NEW – Функция должна создать новый файл. Если файл существует, функция не выполняется.

CREATE_ALWAYS – Функция создаёт новый файл в независимости от его существования.

OPEN_EXISTING – Функция открывает существующий файл. Если он отсутствует, то функция не выполняется.

OPEN_ALWAYS – Функция откроет существующий файл или создаст новый, если его нет.

TRUNCATE_EXISTING – Функция открывает существующий файл и обнуляет его размер.

DWORD dwFlagsAndAttributes используется для двух целей: позволяет устанавливать флаги для оптимизации взаимодействия с устройством, а, так же, если устройство является файлом, – установить его атрибуты. Ниже даны некоторые, наиболее важные, флаги и атрибуты.

FILE_FLAG_NO_BUFFERING – Этот флаг указывает, что доступ к файлу должен производиться без буферизации. Флаг налагает некоторые ограничения:

  • Смещения при доступе к файлу должны быть кратны сектору дискового тома.

  • Число считываемых и записываемых байт должно быть кратно размеру сектора.

  • Адрес буфера должен быть кратен размеру сектора.

FILE_FLAG_SEQUENTAL_SCAN – Позволяет подсистеме I/O оптимизировать последовательный доступ к данным файла.

FILE_FLAG_RANDOM_ACCESS – Позволяет подсистеме I/O оптимизировать доступ к данным файла по случайным смещениям.

FILE_FLAG_WRITE_THROUGH – Определяет сквозное кэширование записи в файл.

FILE_FLAG_OVERLAPPED – Этот флаг задаёт асинхронный обмен данными с файлом.

FILE_ATTRIBUTE_NORMAL – Файл не имеет атрибутов

FILE_ATTRIBUTE_READONLY – Файл только для чтения

… Другие атрибуты файла

HANDLE hTemplateFile – описатель уже открытого файла или NULL. Указывает файл, атрибуты которого должны быть назначены создаваемому файлу.

Возвращаемое значение В случае удачи возвращает описатель файла или устройства, который закрывается функцией CloseHandle. В случае ошибки возвращается значение INVALID_HANDLE_VALUE (0xFFFFFFF)