![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
AlienEmperor |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 160 Пол: Мужской Реальное имя: Серый Репутация: ![]() ![]() ![]() |
В общем, уважаемые, такая проблема: я пишу прогу, которая контролирует некий прибор через COM-порт. Прибор принимает команды, делает то, что от него требуется и в случае команды "передать данные" возвращает результат.
Все это хорошо и красиво, только вот заметил я странную вещь: во время работы прибора комп жутко тормозит, даже мышь по экрану еле ползает, но это еще не все: по каким-то неизвестным мне причинам, начинают отставать системные часы (вообще-то, я считал что это невозможно, ведь за них отвечает отдельная микросхема со своим питанием, а контроллер системного таймера я ес-но не трогал). Теперь о программе: т.к. прибор воспринимает только команды низкого уровния (типа: повернуть двигатель N на M градусов, зажечь лампу P раз, снять показания флуориметра, повернуть еще на M градусов и т.д.), в связи ч чем, все это у меня выведено в цикле: Repeat Повернуть; Зажечь; Считать; Until CurPos>=MoveTo; Перед каждой очередной командой, я должен быть уверен, что прибор в данный момент завершил предыдущую; для этого есть команда: "текущее действие", я вызываю ее после каждого действия и проверяю на ноль (если ноль - то "свободен"). Далее - задержка в 100 мс (это нужно для контроллера прибора) и след. команда. Так вот, задержки я делаю через Sleep(100), сразу после Sleep ставлю Application.ProcessMessages; не фига - тормоза жуткие... Я уже вывел операции с COM-портом в отдельный поток, та же самая ситуация! В общем, я в ауте... Че делать дальше - не знаю (в таком виде прогу сдавать стыдно, она на 1700 Селероне тормозит, да еще и время замедляет...). Да, насчет таймера, на всякий случай: указатели я в проге практически не использую, дин. массивы - тоже, т.е. вероятность того, что я влезаю в системную память и там что-либо меняю - мин. В общем, если у кого есть идеи и предложения, я с радостью бы выслушал... -------------------- Все в жизни ботва... Кроме пчел!
|
![]() ![]() |
xds |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Нефиг опрос использовать... Я уже говорил - WaitCommEvent и дополнительный поток (нить). Ты грузишь систему слишком плотным потоком коротких сообщений через COM-порт. Пути решения: обратная связь (синхронизация по целевому устройству, желательно с разумной скоростью - т. е. агрегат должен сообщать о завершении текущей операции), буферизация на стороне целевого устройства (с целю увеличения длины сообщений и уменьшения их удельного количества).
-------------------- The idiots are winning.
|
AlienEmperor |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 160 Пол: Мужской Реальное имя: Серый Репутация: ![]() ![]() ![]() |
Цитата агрегат должен сообщать о завершении текущей операции... Блин, ну мне это нравится! Если бы я мог что-либо изменить в программе агрегата, то ес-но я бы это сделал! Я был бы счастлив, если бы он посылал мне команду "я мол, закончил операцию и жду команды", но он этого не делает, я ж его не создавал, я ж под него прогу пишу... Будь моя воля я бы там такого наворотил... -------------------- Все в жизни ботва... Кроме пчел!
|
![]() ![]() |
![]() |
Текстовая версия | 9.07.2025 2:07 |