Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 26-02-WaitForSingleObjectEx

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
2.65 Кб
Скачать
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <iostream.h>

HANDLE  hEvent;    // дескриптор события
HANDLE  hThread;   // дескриптор потока
DWORD   IDThread;  // идентификатор потока
DWORD   dwRet;     // код возврата при установке асинхронной процедуры

// процедура, которая вызывается асинхронно
void CALLBACK a_proc(DWORD p)
{
  int n;
  DWORD *ptr = (DWORD*)p;

  cout << "The asynchronous procedure is called." << endl;
  // ждем ввода целого числа
  cout << "Input integer: ";
  cin >> n;
  // увеличиваем счетчик
  *ptr += n;

  cout << "The asynchronous procedure is returned." << endl;
}

// поток, в очередь которого включается асинхронная процедура
DWORD WINAPI add(LPVOID ptr)
{
  DWORD  dwRet;    // код возврата из функции ожидания

  // распечатываем начальное значение счетчика
  cout << "Initial count = " << *(DWORD*)ptr << endl;
  // ждем timeout, или наступление события, 
  // или завершение асинхронной процедуры
  dwRet = WaitForSingleObjectEx(hEvent, 10, TRUE);
  switch (dwRet)
  {
  case WAIT_OBJECT_0:
    cout << "The event is signaled." << endl;
    break;
  case WAIT_IO_COMPLETION:
    cout << "The asynchronous procedure is done." << endl;
    break;
  case WAIT_TIMEOUT:
    cout << "Time out." << endl;
    break;
  default:
    cout << "Another case." << endl;
    break;
  }
  // распечатываем конечное значение счетчика
  cout << "Final count = " << *(DWORD*)ptr << endl;

  return 0;
}

// главный поток
int main()
{
  char c;
  DWORD  count = 10;

  // спрашиваем, что установить: событие или асинхронную процедуру
  cout << "Input: " << endl << "\te - to set event" << endl
    << "\ta - to set asynchronous procedure" << endl
    << "\tanother char - timeout" << endl
    << "->";
  cin >> c;

  // запускаем поток
  hThread = CreateThread(NULL, 0, add, &count, 0, &IDThread);
  if (hThread == NULL)
    return GetLastError();

  // создаем событие с автоматическим сбросом
  hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  if (hEvent == NULL)
    return GetLastError();

  switch (c)
  {
  case 'e':
    // устанавливаем событие
    SetEvent(hEvent);
    break;
  case 'a':
    // устанавливаем асинхронную процедуру для потока 
    dwRet = QueueUserAPC(a_proc, hThread, (DWORD) &count);
    if (!dwRet)
    {
      cout << "Queue user APC failed:" << dwRet << endl;
      return 0;
    }
    break;
  default:
    break;
  }

  // ждем, пока поток add закончит работу
  WaitForSingleObject(hThread, INFINITE);
  // закрываем дескриптор потока
  CloseHandle(hThread);

  return 0;
}
Соседние файлы в папке Листинги