в общем задача такая. происходит некоторое событие и должен активироватся поток с мониторингом печати, и накапливать информацию о посылке печати на принтер. на эту тему посты на форуме уже не раз поднимались, но вразумительного ответа ни один из них не получил.
и так, что делаю я:
| Код | procedure TPrintSpooler.Execute; var lNext: LongBool; {******************************************} {Эти структуры мне не нужны, но для параметра в FindNextPrinterChangeNotification пришлось их создать} pdwChange: DWORD; PrintOptions: PRINTER_NOTIFY_OPTIONS;
pPrnNotifyInfo: pPrinterNotifyInfo; PrnNotifyInfo: PRINTER_NOTIFY_INFO;
pPrnNotifyInfoData: pPrinterNotifyInfoData; PrnNotifyInfoData: PRINTER_NOTIFY_INFO_DATA; {*******************************************} begin hPrinter := OpenCurrentPrinterHandle; hNotification := FindFirstPrinterChangeNotification(hPrinter,PRINTER_CHANGE_ALL,0,nil); //PRINTER_CHANGE_JOB if hNotification = INVALID_HANDLE_VALUE then begin ErrorCode := GetLastError ; Synchronize(MainForm.showerror); ClosePrinter(hPrinter); end; repeat Synchronize(MainForm.EnabledF); //это для визуального контроля работы процесса lNext := false; hWait := WaitForSingleObject(hNotification, INFINITE); case hWait of WAIT_FAILED : ErrorCode := GetLastError ; WAIT_OBJECT_0 : lNext := FindNextPrinterChangeNotification(hNotification, pdwChange, @PrintOptions, Pointer(pPrnNotifyInfo)); else Synchronize(MainForm.showerror1); end;
if lNext then MainForm.UpdatePrinter(hPrinter); // здесь вызывается EnumJobs sleep(100); Synchronize(MainForm.EnabledT); //это для визуального контроля работы процесса until Terminated; FindClosePrinterChangeNotification(hNotification); CloseHandle(hNotification); CloseHandle(hPrinter); end;
{Открываем принтер и получаем его хендл} function OpenCurrentPrinterHandle: THandle; var Device, Driver, Port: array[0..255] of Char; hDeviceMode: THandle; begin Printer.GetPrinter(Device, Driver, Port, hDeviceMode); if not OpenPrinter(@Device, Result, nil) then RaiseLastWin32Error; end;
|
что происходит: при запуске процесса первые 15-20 сек. он чем то занят, потом отрабатывается if lNext then, причем никакой работы с принтером в этот момент нет. затем цикл крутит и lNext всегда false даже если принтер печатает. Кто-нить работал с ожиданиями? |