Книга: Системное программирование в среде Windows

Вывод списка фоновых задач

Вывод списка фоновых задач

Программа 6.5 реализует функцию управления задачами DisplayJobs.

Программа 6.5. JobMgt: отображение списка активных задач 

BOOL DisplayJobs(void)
/* Просмотреть файл базы данных, сообщить статус задачи. */
{
 HANDLE hJobData, hProcess;
 JM_JOB JobRecord;
 DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;
 TCHAR JobMgtFileName[MAX_PATH];
 OVERLAPPED RegionStart;
 GetJobMgtFileName(JobMgtFileName);
 hJobData = CreateFile(JobMgtFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 RegionStart.Offset = 0;
 RegionStart.OffsetHigh = 0;
 RegionStart.hEvent = (HANDLE)0;
 FsLow = GetFileSize(hJobData, &FsHigh);
 LockFileEx(hJobData, LOCKFILE_EXCLUSIVE_LOCK, 0, FsLow, FsHigh, &RegionStart);
 __try {
  while(ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL) && (nXfer > 0)) {
   JobNumber++;
   if (JobRecord.ProcessId == 0) continue; 
   hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, JobRecord.ProcessId);
   if (hProcess != NULL) GetExitCodeProcess(hProcess, &ExitCode);
   _tprintf(_T(" [%d] "), JobNumber);
   if (hProcess == NULL) _tprintf(_T(" Готово"));
   else if (ExitCode != STILL_ACTIVE) _tprintf(_T("+ Готово"));
   else _tprintf(_T(" "));
   _tprintf(_T(" %sn"), JobRecord.CommandLine);
   /* Удалить процессы, которые в системе уже не присутствуют. */
   if (hProcess == NULL) {
    /* Зарезервировать одну запись. */
    SetFilePointer(hJobData, –(LONG)nXfer, NULL, FILE_CURRENT);
    JobRecord.ProcessId = 0;
    WriteFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);
   }
  } /* Конец цикла while. */
 } /* Конец __try-блока. */
 __finally {
  UnlockFileEx(hJobData, 0, FsLow, FsHigh, &RegionStart);
  CloseHandle(hJobData);
 }
 return TRUE;
}

Оглавление книги


Генерация: 0.074. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз