Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | | |
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут... 20.07.04 14:39 Число просмотров: 1680
Автор: Killer{R} <Dmitry> Статус: Elderman
|
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут 0 это ты зря ставил - 0 означает что он будт ждать вечно, то есть такое значение по дефолту стоит.
COMMTIMEOUTS cmto,cmt;
GetCommTimeouts(f,&cmto);cmt=cmto;
cmt.WriteTotalTimeoutMultiplier=10;
cmt.WriteTotalTimeoutConstant=100;
SetCommTimeouts(f,&cmt);
|
<programming>
|
[Win32] Люди помогите с writefile!!! 20.07.04 11:44
Автор: alex_b Статус: Незарегистрированный пользователь
|
Добрый День уважаемые программеры...
Возникла необходимость печатать на матричный принтер... До этого юзал API и все было пучком, работал с канвой и все было ОК.. В текущей задаче таких заморочек не надо, нужно тупо открывать текстовый файл и отправлять его на матричный принтер, что я и делал, но вот незадача, нужно проверять готовность принтера, ну там вдруг питание отключили или еще что, и соотвтетственно реагировать... Под Win9x юзал Int 17h... ПОд Nt/XP/2000 такая фишка не катит (оно и понятно), начитавшись MSDN стал юзать CreateFile и WriteFile, и вот тут-то и вылез весь геммор, Создаю файл как LPT1, все нормально.... Но как только вызываю WriteFile прога замирает на этой функции и все.... (Учитывая что питание принтера вырубленно... При включенном питание функция отрабатывает на Ура!), и пока принтер не включишь из этой функции не выходит... Прочитал, что после создания файла нужно выставлять параметры порта (про таймаут и т.п.), но ничего вразумительно не нашел...
Так вот вопрос: Как под все платформы Windows узнать состояние локального матричного принтера
на текущий момент, интересует состояние готовности к печати!
Как сие реализовать, чтоб работало под Win9x/Nt/2000/XP?
Заранее благодарен, за любые ответы! =)
|
|
[Win32] Таймауты можно выставить для COM-портов, а для LPT можно делать CreateFile в Overlapped режиме 20.07.04 12:04
Автор: amirul <Serge> Статус: The Elderman
|
Потом можешь ожидать завершения обычным WaitForSingleObject с любым таймаутом
|
| |
Хм... 20.07.04 12:13
Автор: alex_b Статус: Незарегистрированный пользователь
|
> Потом можешь ожидать завершения обычным WaitForSingleObject > с любым таймаутом А вызывать WaitForSingleObject как? После чего или в отдельном потоке? Вот гемморой-то! =( Всего-то надо проверить готовность принтера, а писанины дофига!
|
| | |
При создании файла в overlapped режиме [upd] 20.07.04 12:26
Автор: amirul <Serge> Статус: The Elderman
|
> > Потом можешь ожидать завершения обычным > WaitForSingleObject > > с любым таймаутом > А вызывать WaitForSingleObject как? После чего или в > отдельном потоке? Вот гемморой-то! =( Всего-то надо > проверить готовность принтера, а писанины дофига! Ты создаешь структуру OVERLAPPED, одним из полей которой является EVENT, который будет выставлен по завершении асинхронной операции.
Специально для работы с OVERLAPPED файлами есть функция GetOverlappedResult(). Если последним аргументом передать FALSE, то текущее состояние операции будет выдано без ожидания.
Как говорит MSDN:
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Ну а GetLastError в случае висящего Write-а выдаст ERROR_IO_PENDING
-----------------
Вообще то я прогнал. Только что перечитал MSDN, параллельный порт тоже является Communication device, так что можешь использовать простые SetCommMask/WaitCommEvent :-)
|
| | | |
Сейчас попробую... 20.07.04 12:55
Автор: alex_b Статус: Незарегистрированный пользователь
|
Слушай а при использовании SetCommMask не надо Ovverlaped юзать?
|
| | | | |
SetCommMask вроде проходит, но при выключенном принтере все равно из WriteFile не выйти.. 20.07.04 13:10
Автор: alex_b Статус: Незарегистрированный пользователь
|
Блин как детектить что принтер не отвечает? Ума не приложу, на асме 3 строчки, и проблем нет, но эта NT вонючая нифига делать не дает!!!!
|
| | | | | |
Дык сразу и сказал бы, что нужно только для NT 20.07.04 14:03
Автор: amirul <Serge> Статус: The Elderman
|
> Блин как детектить что принтер не отвечает? Ума не приложу, > на асме 3 строчки, и проблем нет, но эта NT вонючая нифига > делать не дает!!!! И правильно что не дает - иначе наделали б делов. И совсем она не вонючая, кроме того, как кореллируют асм и NT?
Используй DeviceIoControl с кодом IOCTL_PAR_QUERY_INFORMATION.
PARALLEL_BUSY
PARALLEL_NOT_CONNECTED
PARALLEL_OFF_LINE
PARALLEL_PAPER_EMPTY
PARALLEL_POWER_OFF
PARALLEL_SELECTED
Достаточно полная информация?
Вот только сомневаюсь, что 9x вонючая :-) такое поддерживает
|
| | | | | |
SetCommTimeouts поставь 20.07.04 13:24
Автор: Killer{R} <Dmitry> Статус: Elderman
|
|
| | | | | | |
ставил SetCommTimeouts с тайм-аутом=0 нифига не работает... Может кусок кода кинете? 20.07.04 13:40
Автор: alex_b Статус: Незарегистрированный пользователь
|
|
| | | | | | | |
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут... 20.07.04 14:39
Автор: Killer{R} <Dmitry> Статус: Elderman
|
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут 0 это ты зря ставил - 0 означает что он будт ждать вечно, то есть такое значение по дефолту стоит.
COMMTIMEOUTS cmto,cmt;
GetCommTimeouts(f,&cmto);cmt=cmto;
cmt.WriteTotalTimeoutMultiplier=10;
cmt.WriteTotalTimeoutConstant=100;
SetCommTimeouts(f,&cmt);
|
| | | | | | | | |
Уррааааааа Заработало !!!! Всем big Thanx... 20.07.04 15:57
Автор: alex_b Статус: Незарегистрированный пользователь
|
|
|
|