![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Gremlin |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
При выполнении
заметил что переводит в состояние Ожидание байтов, и даже после выполнения функции и завершения потока я не могу записать в порт. поэтому в конце я стал ставить
тогда все нормально! Но вот проблема начинается в другом! Задача у меня следующая: Есть кнопки Старт и Стоп. Нажимаю Старт и открывается поток с функией Write которая причом в цикле посылает команду опрашивать текущее значение! Нажимаю клавишу Стоп цыкл останавливается. Сразу после открытия потока Write открывается поток с Read
Но в buf ничего не приходит тк ком порт занят Write, подскажите как мне разрулить эти два потока! Это сообщение отредактировал(а) Gremlin - 6.10.2006, 18:22 |
||||||
|
|||||||
Gremlin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
вот так реализован цикл
Это сообщение отредактировал(а) Fixin - 7.10.2006, 09:03 |
|||
|
||||
Gremlin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
Это сообщение отредактировал Fixin - 7.10.2006, 09:03 ????????
|
|||
|
||||
Gremlin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
и еше вопрос почему чтобы получить коректно данные мне приходится вводить Sleep и подбирать милисекунды хотя поидее назначая маску EV_RXCHAR (событие получение символа) а потом идет (!WaitCommEvent(hPort, &dwMask, &OverRead)) тоесть ждать до наступления события маски дак почему мне приходится искуственно вводить задержку?
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
писать то в цикле не надо, это читать может понадобится несколько раз.
пишешь 1 раз, затем начинаешь читать и пока не прочитаешь верный отклик от железки, ни чего писать в порт не надо. Дождись ответа, затем можно снова писать команду и снова читать и т.д. Сделай эту операцию парной чтение-запись, тогда все будет ок. Добавлено @ 22:07 поток, по сути нужен только для того, чтобы винду не вешать во время чтения. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Gremlin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
дак мне тогда придется чтобы послать кнопочку старт жать
![]() Добавлено @ 05:30 я то делаю поток на Write именно для того чтоб из основного потока смог остановить цыкл и завершить поток |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Это-то понятно, но в любом случае, на каждую команду записи нужно дождаться отклика. Это можно сделать 2-мя способами:
1. Использовать события. Создай 2 события с помощью функций CreateEvent, допустим hReadCommand и hAbort. В потоке чтения, после того как отклик получен, поднимаешь событие hReadCommand, на которое реагирует поток записи, он проверяет флаг fStopped и если флаг опущен, то посылает очередной запорс в железку. В конце программы поднимай событие hAbort, на которое реагируют оба потока, они по этому событию будут выходить из цикла, тем самым, савершая потоки. После того, как в основной программе поднимаешь событие hAbort, жди оба потока с помощью функции WaitForMultiplyObjects. Можно завести 3-тье событие hWriteCommand, вместо флага fStopped, которое поднимается при нажатии кнопки "Пролдолжить" и "Старт". На это событие будет реагировать поток записи, оно будет сигнализировать, чтобы начать цикл посылки команд в железо. 2. Использовать сообщения. То же самое, но только заводишь не события а дополнительные сообщения(либо с помощью RegisterWindowMessage, либо просто WM_USER + 500), которые обрабатываешь в основном окне, а вместо сигнализации посылаешь из потока чтения SendMessage самому себе, либо крутишь PostMessage. В этом случае достаточно и 1 потока. Выбирай любой способ, который по душе. Конечно, не просто, но раз уж взялся за такое дело... ЗЫ: мусор в буфере как раз и обуславливается бесконечной посылкой в железо команд: в то время, как первая команда начинает ложится в буфер, приходит вторая, в буфере собирается кусок первой и кусок второй и т.д., в конечном счете ни одну команду толком разобрать не можешь, поэтому и ставишь искусственно задержку слипом, не хорошо. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Gremlin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
"В конце программы поднимай событие hAbort, на которое реагируют оба потока, они по этому событию будут выходить из цикла, тем самым, савершая потоки. "
Не понял как это реализовать тоесть потоки должны робить и одновременно ожидать этого события! Следовательно по аналогии с hReadCommand WaitForSingleObject(hAbort, 2000) использовать нельзя дак как мне в любом месте выполнения потока отловить это сообщение и закрыть потоки/циклы? Это сообщение отредактировал(а) Gremlin - 29.10.2006, 10:04 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |