Как установить приоритет выполнения?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Как установить приоритет выполнения?

Сообщение Rojohn » 04.06.2007 (Пн) 22:00

Здравствуйте эксперты!
В моей программе происходит опрос LPT порта, откуда регулярно должны поступать данные с цифровых устройств. Возникла проблема с тем, что другие процессы Windows не должны мешать поступлению сигнала с LPT в программу. Как посоветуете правильнее сделать, чтобы в момент поступления сигнала на LPT порт процесс получения его программой становился приоритетным (Realtime=31 если по WinAPI). Подозреваю, что это можно сделать через функцию SetPriorityClass, но после статьи Тёмыча про многопоточность у меня закрались сомнения. Но, что нужно использовать API я почти не сомневаюсь. Если можно, подскажите правильную API, желательно с синтаксисом написания в программе (я в них пока не особо силен).
З.ы.: Для связи с LPT используется общеизвестный модуль DLPortIO, то бишь вызов примерно такой:
Код: Выделить всё
DVal = "&H" & Hex(DlPortReadPortUchar(Val("&H378")))

Спасибо за помощь!
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.06.2007 (Пн) 22:27

Если не проламывать дыру в стройной структуре WinNT использованием общеизвестного модуля DLPortIO, а открыть порт как файл (можно даже Open "lpt1" For Input), то система сама установит на порт блокировку на то время, пока он открыт твоей программой, что предотвратит нежелательное вмешательство чужих прог в процесс общения с портом.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 04.06.2007 (Пн) 22:32

А все ли возможности работы с портом сохраняться? Смогу ли я записывать и считывать с порта, открытого как файл, HEX значения?
И куда записывать наименование адреса порта, например Val(&H378)? А для записи числового значения в этот порт использовать Write?
Последний раз редактировалось Rojohn 04.06.2007 (Пн) 22:59, всего редактировалось 1 раз.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.06.2007 (Пн) 22:58

Наименование порта (lpt1, lpt2, etc.) и нужно использовать -- вместо его адреса.
Записывать нужно, кажется, побайтно. Можно и через Print.
Считывать с LPT никогда не пробовал.
Сейчас уже засыпаю на ходу, так что ничего дельного сегодня не подскажу.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 04.06.2007 (Пн) 23:04

Тёмыч, спасибо и на этом! Хотя, если будет время, скажи чего-нить поподробнее. У меня такое ощущение, что простой Open не даст возможности правильно и точно настраивать сегменты (адреса) порта. А при подстройке под разные цифровые устройства это может быть существенно...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

!

Сообщение Rojohn » 05.06.2007 (Вт) 11:58

Вот вроде более понятно объясняется:
http://www.vbrussian.com/Article.asp?ID=81

Но там платная утилита + без права расспространения. Может кто посоветует хорошую бесплатную альтернативу TVicHW32? Или как написать самому нечто подобное TVicHW32 без наворотов, только чтоб чтение/запись LPT (с указанием конкретного сегмента) Long и Hex значений?
Последний раз редактировалось Rojohn 25.06.2007 (Пн) 10:14, всего редактировалось 1 раз.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 11.06.2007 (Пн) 21:15

Пытаюсь написать чтение и запись LPT:
Код: Выделить всё
Private Sub cmbReadLPT_Click()
  Dim vStr As String
 
  Open "lpt1.dos" For Input As #1
'    Do While Not EOF(1)
    Input #1, vStr
    tbxReadLPT.Text = vStr
'    Loop
  Close #1
End Sub

Private Sub cmbWriteLPT_Click()
  Open "lpt1.dos" For Output As #1
    Print #1, tbxWriteLPT.Text
  Close #1
End Sub


Запись вешает программу, а чтение ругается на не тот тип файла...
Хелп ми плиз...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.06.2007 (Пн) 21:36

(Пытаюсь попасть пальцем в небо)
А что, если открывать не "lpt1", а "\\.\GlobalRoot\Device\ParallelPort0" :?:
По идее, это должно направить запрос мимо спулера печати и прочего искусственного интеллекта.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 11.06.2007 (Пн) 21:48

Пишу:
Код: Выделить всё
Open "\\.\GlobalRoot\Device\ParallelPort0" For Output As #1
   Print #1, tbxWriteLPT.Text
Close #1


Ругается на неправильное имя файла в Close...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 11.06.2007 (Пн) 22:00

Работать через Win32 API? То есть, вместо Open CreateFile, вместо Print WriteFile и т. д.?
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

ехх

Сообщение Rojohn » 11.06.2007 (Пн) 22:06

Может и надо, но надо знать сложную структуру виндовс... если есть примерчик - подкиньте плиз....
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.06.2007 (Пн) 22:24

keks-n, ничего от этого не поменяется.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 11.06.2007 (Пн) 23:44

Так где же выход искать из ситуэйшина?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 12.06.2007 (Вт) 10:45

tyomitch
На Close падать не будет
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.06.2007 (Вт) 11:10

Ну тогда проще выкинуть нафиг этот Close, тоже падать не будет ;-)

Дело-то в том, что вывод в этот порт не проходит на другой конец провода, а проглатывается.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 13.06.2007 (Ср) 17:04

А как в таком случае закрывать файловую переменную? Ведь мне надо обращаться к порту в цикле (реальном времени)! Не делать же бесконечное их количество...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2007 (Ср) 17:08

Можно одну открыть, и больше не закрывать...
Только вот не проходит ничего в порт, похоже.
Я со своим принтером проверял, по крайней мере -- в него ничего не прошло.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 13.06.2007 (Ср) 18:49

В принципе, мне не для принтера надо, но это наверное без разницы... Тогда остается наверное WinAPI32 использовать, но с этим у меня пока что проблемы. Там надо структуру NT знать, как правильно приоритеты ставить и, кроме этого, для разных виндов будут разные API похоже. Может у кого есть какие наработки в этой области? Или всё же мучить Open?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2007 (Ср) 21:15

Я не думаю, что использование API добавит какие-нибудь возможности по сравнению с обычным Open.
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 13.06.2007 (Ср) 23:58

А как тогда писать чтение из порта? Когда пишу:
Код: Выделить всё
Open "\\.\GlobalRoot\Device\ParallelPort0" For Input As #2

Говорит, что файл уже открыт...

И файловая переменная будет висеть в памяти до завершения программы чтоли?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 14.06.2007 (Чт) 0:15

Надо открывать For Binary, видимо
Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

???

Сообщение Rojohn » 14.06.2007 (Чт) 0:58

В случае:
Код: Выделить всё
Open "\\.\GlobalRoot\Device\ParallelPort0" For Binary As #1
    Put #1, , tbxWriteLPT.Text
Close #1

В Put говорит "Не правильный номер файла", а в случаях:
Код: Выделить всё
Open "lpt1" For Binary As #1
    Put #1, , tbxWriteLPT.Text
Close #1

и
Код: Выделить всё
Open "lpt1:" For Binary As #1
    Put #1, , tbxWriteLPT.Text
Close #1

вообще вешает бэйсик...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 14.06.2007 (Чт) 1:48

Потом, боюсь операция Open слишком высокоуровневая, а мне придётся работать с сегментами порта, т.е. прописывать, в какие именно адреса порта надо писать и читать. Так что, наверное придётся всё-таки "проламывать" NT с помощью DLPortIO, предварительно установив ей самый высокий RealTime приоритет NT. Но это общие мысли и фантазии, а что в реале? Так можно делать? Если можно, то как это сделать правильно? Конечно, в идеале, хорошо бы иметь исходник DLPortIO и подправить его с учетом приоритетов NT. И драйвер ставить не нужно было бы. Но нет исходника, к сожалению... Неужели никто с LPT не работал, кроме как с принтером?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

???

Сообщение Rojohn » 15.06.2007 (Пт) 15:29

А что вы думаете насчёт библиотеки Inpout32.dll? Она учитывает приоритеты Windows? Просто вроде все люди обращаются именно через эти DLL, вот пример:
http://www.emanual.ru/download/www.eManual.ru_42.zip

Просто я бы думал, что не дураки же делали эти DLL-ки и наверняка предусмотрели подстройку под винды...
Последний раз редактировалось Rojohn 25.06.2007 (Пн) 10:13, всего редактировалось 1 раз.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Товарищи!

Сообщение Rojohn » 19.06.2007 (Вт) 9:27

Уважаемые! Вот нашел примерчик для работы с LPT портом, но он на C, которым я пока что не владею. Может мог бы кто-нибудь помочь перевести его в VB, хотя бы частично, чтобы стало понятно как это делать? И обеспечивает ли этот пример нормальную работу в Windows (приоритеты и др.)?
Вот сcылки на пример:
http://www.pcports.ru/articles/4.php
http://www.pcports.ru/xDRV_sys.php
Лучше пример по второй ссылке, тем более там уже есть код на VC++ и Delphy...
Спасибо всем заранее!
Последний раз редактировалось Rojohn 25.06.2007 (Пн) 10:13, всего редактировалось 1 раз.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 25.06.2007 (Пн) 9:51

Да... посмотрел эти примеры :( используются те же самые библиотеки, проламывающие структуру NT. Так что пока что остается один вариант - платная библиотека TVicHW32 (см. выше) да и то очень сомнительно. Есть правда ещё шанс домучить Open, но у меня большие сомнения, что это то, что надо. Товарищи, чё делать, куда рыть? :?: Или может всё-таки эти готовые dll не так страшны и можно как-то установить им приоритет?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.06.2007 (Пн) 10:02

Rojohn
Для вставки обычной ссылки не обязательно писать теги [url][/url]. Но даже если очень хочется, нужно писать всё на одной строчке и без пробелов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

:)

Сообщение Rojohn » 25.06.2007 (Пн) 10:10

Лана, спасибо, учту в дальнейшем! А есть ли по существу вопроса чаго-нить?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Wildwhiteash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2007 (Чт) 17:02
Откуда: Украина, Николаев

Сообщение Wildwhiteash » 06.07.2007 (Пт) 22:17

есть такая штука IO.DLL
http://www.geekhideout.com/iodll.shtml
сам пользую и другим рекомендую

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 06.07.2007 (Пт) 23:43

Судя по описанию штука неплохая, спасибо! А как у неё с "проламываением" структуры Windows, т.е. с приоритетом? Будет ли установлен самый высокий приоритет при обмене данными с портом?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 45

    TopList