![]() |
|
![]() ![]() ![]() |
|
Eminem |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.2.2012 Репутация: нет Всего: нет |
Hi.
Есть 'долгий' цикл в программе под MFC - синхронная работа с портом, на время его работы замораживается приложение. Что надо сделать в цикле чтобы этого не происходило? |
|||
|
||||
heavix |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Гуи должен быть в отдельном потоке. Создавай поток, который будет работать с портом.
Почитайте про многопоточность. Это сообщение отредактировал(а) heavix - 13.2.2012, 12:32 |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Надо из цыкла сделать конечный автомат, в котором каждый приход/расход байтов так или иначе ничего не блокирует. Например, с использованием неблокирующихся файловых дескрипторов. Или с помощью аналогов select/waitformultipleobjects. На C проще всего это сделать при помощи switch:
И этот код вызывать периодически -- например, по тому жэ WaitFor или по таймерам или по сообщению о свободном процэссоре. PS Если то, что я написал кажэтся слишком сложным -- то не следует и пытаться взяться реализовывать это с помощью трэдов -- так сложностей гораздо большэ, и их непонимание приводит к неочевидным нечасто вылазящим косякам, а не просто к тому, что что-то сразу не запускается. |
|||
|
||||
Eminem |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.2.2012 Репутация: нет Всего: нет |
heavix
Эм.. У меня есть потоки которые работают непосредственно с портом - один принимает пакеты, другой передает. Порт обращен в сеть RS485 и PC является мастером в этой сети. Допустим мне надо сформировать сотню пакетов и отправить их в сеть. Можно конечно сформировать сразу все пакеты и зарядить их... Но сейчас сделано по простому:
Просто я подумал что можно в этом цикле отдавать управление обработчику событий приложения. Ладно, попробую организовать еще один поток. tzirechnoy
В принципе код мне понятен и идея организовать машину состояний тоже, но не совсем понимаю куда ее вставить. В MFC скрыт superloop, вызывать код периодически по таймерам не эффективно, по сообщению - пока не представляю как сделать. Боюсь что запутаюсь в конце... А что есть треды? |
||||||
|
|||||||
heavix |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Можно организовать очередь пакетов. а саму передачу выбросить в отдельный поток. Так же можно организовать стек приема... и слушать порт тоже в отдельном потоке - это если либа которую вы исспользуете для комуникации с портом позволит вам это сделать. Можно писать на чистом api и исспользовать IO_CONTROL ы тогда Вам самому прийдется реализовать протокол обмена (или слямзить чужой и перековырять). Или я просто неправильно понял вопрос?
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Можно, конечно, еще в цикл (после каждой итерации) вставить мини-цикл обработки сообщений (PeekMessage-DispatchMessage), но беда в том, что это не обеспечит полноценной обработки. Такой подход подойдет только если нужно всего-то иметь возможность прервать процесс.
Так что поток - наилучший выход. Думаю, автор имел в виду именно потоки (threads). Подход, предложенный tzirechnoy (т.е. квантование операции) - сложнее в смысле избыточности кода - нужно завести массу переменных состояния вместо обычных автоматических. Это неизящно и вообще противоречит мировой гармонии. Иногда так приходится делать по необходимости, но отдельный поток, если это возможно - лучше. Всего-то нужно обеспечить защиту совместных данных и возможность прерывания (если надо) по желанию пользователя. -------------------- ... |
|||
|
||||
Eminem |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.2.2012 Репутация: нет Всего: нет |
heavix
Это не либа, это мой класс работы с портом. Один поток принимает данные с порта, проверяет легетимность пакета и ложит в FIFO указатель на RAW данные из него. Другой поток занимается отсылкой готовых пакетов (тоже по FIFO). В принципе Ваш первый ответ меня убедил однозначно. Где тут плюсы ставятся. Earnest
Ну да, треды конечно - именно потоки. Вообщем мне тоже покзалось что выйдет запутанно со state mashine, хотя можно. Реализовал отдельным потоком. Реальное спасибо всем. PS: Хе-хе, а плюсов то не поставить... Это сообщение отредактировал(а) Eminem - 14.2.2012, 22:11 |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |