Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ожидание потока или хз чего это, помогите, не могу сам разобратся 
:(
    Опции темы
Cashey
Дата 15.5.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



в общем задача такая. происходит некоторое событие и должен активироватся поток с мониторингом печати, и накапливать информацию о посылке печати на принтер. на эту тему посты на форуме уже не раз поднимались, но вразумительного ответа ни один из них не получил.

и так, что делаю я:
Код

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 даже если принтер печатает. Кто-нить работал с ожиданиями?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
dumb
Дата 15.5.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



если lNext false, неплохо GetLastError посмотреть.

со спецификой мониторинга принтера не знаком, посему вот тебе первый "напаренный" пример smile
PM MAIL   Вверх
Cashey
Дата 16.5.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(dumb @  15.5.2008,  17:19 Найти цитируемый пост)
если lNext false, неплохо GetLastError посмотреть.

да, действительно, выдается ощибка 87 , что расшифровывается как "Параметр задан неверно"

изменил код таким образом
Код

  if lNext then
    MainForm.UpdatePrinter(hPrinter)
  else begin
    ErrorCode := GetLastError;
    Synchronize(MainForm.showerror);
  end;

а в showerror прописал
Код
procedure TMainForm.showerror;
var
 MsgBuf: PChar;
begin
 if FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or
     FORMAT_MESSAGE_FROM_SYSTEM,
     nil,
     unit3.ErrorCode,
     0,
     @MsgBuf,
     0,
     nil) > 0 then
     begin
      ShowMessage('Ошибка : ' + MsgBuf);
      LocalFree(Cardinal(MsgBuf));
     end
end;


видимо при повторном вызове надо изменить параметры FindNextPrinterChangeNotification, но вот только на что?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
dumb
Дата 16.5.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



тонкостей дельфевого синтаксиса не помню, посему предположение такое: pdwChange - это таки адрес(хотя @ оно(дельфо) вроде само догадывается брать в зависимости от сигнатуры вызываемой функции), ну и неинициализированная структура PrintOptions.

Код

dwChange: DWORD;
...
FindNextPrinterChangeNotification(hNotification, @dwChange, nil, Pointer(pPrnNotifyInfo));
?
PM MAIL   Вверх
Cashey
Дата 16.5.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(dumb @  16.5.2008,  17:59 Найти цитируемый пост)
FindNextPrinterChangeNotification(hNotification, @dwChange, nil, Pointer(pPrnNotifyInfo));

пробовал. тогда выдается ошибка "Неверный дескриптор"


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1027 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.