Вывод списка фоновых задач
Вывод списка фоновых задач
Программа 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(" %s "), 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;
}