![]() |
|
![]() ![]() ![]() |
|
MikhaelKreuz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Здравствуйте.Тему "завершение зацикленного потока" я закрыл,т.к. понял что не в ту степь лезу.
Я попробую изложить свою задачу.А Вас попрошу подсказать мне есть ли необходимость использовать в ней потоки и какой можно использовать альтернативный вариант. Мне необходимо создать программу которая будет работать с внешним устройством.А точнее обмениваться данными с устройством по COM порту.Обмен этот описан неким стандартом.Мне просто надо воспроизвести его.Я спрашиваю - устройство отвечает. Сначала устанавливаем связь.Потом начинаем спрашивать. Я сделал так. Разбил запросы на группы по характеру и для каждой группы создал поток(классами).Так же сделал поток для установления связи с устройством. Так вот.При запуске начинает работать поток установления связи.Когда связь есть,этот поток в зависимости от желаемой группы запросов(т.е выбираем вкладку одну - запрашиваем одни данные,другую - другие и т.д.) запускает определенный поток и уничтожает себя сам.Новый поток начинает прокручивать запросы.Прокуручивать запросы набо постоянно чтоб не потерять связь.При выборе другой вкладки,текущий поток запускает новый поток и убивает себя сам. Каждая группа очень большая запросов по 20.А есле вместе все группы то около 200.Если это всё прокручивать в главном потоке формы,то пипец.А ещё надож выводитть на форму то что отвечает устройство,этож ваще... Короче,мне подсказали сделать потоками.Я начал разбираться в них,оказалось не так то просто.То что я на данный момент уже сделал описанным выше способом,работает нормально,только возникают косяки. Подскажите пути решения задачи,пожалуйста. |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
возникает резанный вопрос: а нафига такую кучу потоков городить? -- в основной функции (единственного рабочего потока) в зависимости от текущего состояния вызываем соответствующую состоянию функцию. и все...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
MikhaelKreuz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Я так делал.Я ж первым делом об этом же и подумал.Результат 82% ЦП.Но всё прекрасно работает.
Я так понимаю,единчственная пока что причина использования хоть одного потока - это разгрузить форму иначе она мертвая висеть будеть.Правильно ли я думаю? |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
ну так приоритет потоку понизь. или Sleep'ов добавь...
таки да. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
HappyLife |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 4 Всего: 8 |
MikhaelKreuz, Чтобы форма мертвая не висела. нужно переодически вызывать Application->ProcessMessages();
|
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
это костыли. причем не особо хорошие...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
MikhaelKreuz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
на счёт Application->ProcessMessages();
Я добавлял.И когда без потоков делал и когда с всё в одном потоке делал.Действительно похоже на костыли. Мож я канечна не до конца понимаю,но блин пробовал... ![]() Добавлено через 2 минуты и 36 секунд
Приоритет понижал - связь с устройством начинет чаще слетать.А на ЦП не особо отразилось 60 - тож не хорошо.И Sleeepов там достаточно. |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
если поток сильно жрет проц -- явно не достаточно... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
HappyLife |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 4 Всего: 8 |
MikhaelKreuz, Сделай два потока, один для визуализации формы, другой, для выполнения работы с портом.
|
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Говоришь, костыли... А сам чего предлагаешь? Sleep'ы, приоритет понизить... MikhaelKreuz, делай
я так и делаю, нормально работает с многими портами одновременно -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
я предлагаю простой способ понизить нагрузку на процессор (это не говоря о том, что ее не особо нужно понижать).
ProcessMessages же используют если нет желания заморачиваться с потоками. + форма перестанет "умирать" но всеравно будет дергаться на каких-нить функция чтения/записи в порт... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
В принципе, без Sleep'ов в любом случае не обойтись, даже при использовании потоков. Ибо не всегда устройство мгновенно может вернуть ответ на запрос
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
MikhaelKreuz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
ksili - в точку.Sleepы я для этого и использую.Устройству нужно время для ответа.А про один поток рабочий,другой для визуализации, я думал.Это ж логичнее так сделать.Но меня сразу спугнуло то что в нём будет охеренно здоровое тело(Execute и др. функции),т.к. запросов куча,каждый нада обработать ещё.По этому даже пробовать не стал....попробую.
А что ты имеешь ввиду под потоком для визуализации формы?Её собственный поток,который автоматом создается при создании процесса?Или ещё дополнительный? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |