![]() |
Форма в отдельном потоке
День добрый всем!
Стоит следующая задача: Есть программа получающая данные от прибора и эти данные нужно отображать на графике. Получение данных критично ко времени, а перерисовка графики часто занимает больше времени чем интервал между приходом отдельных пакетов данных, соответственно происходит сдвиг пакетов по времени или их потеря, а это недопустимо. Поэтому есть идея вынести отображение графики в отдельный поток и пониженным приоритетом. Но как я понимаю создавать форму в отдельном потоке нельзя. Соответственно возникает вопрос, как можно это решить? Делать форму через WinApi не охота, больно уж гимморойно, может есть еще какое-то решение? добавлено через 31 минуту Да, забыл написать, пишу в Delphi. |
Не надо форму в отдельном потоке.
просто нужно выставлять флаг. когда данные еще рисуются и если он выставлен, то не обновлять форму... |
PSyton
Отображать данные в процессе их получения тоже необходимо и нужно сделать, чтобы отображение не мешало получению. А поскольку сейчас все происходит в контексте одного потока, то может произойти такой случай (на медленном компе например), между получением каких-то пакетов данных программа решит перерисовать график и не успеет это сделать до прихода следующего пакета, соответственно его мы можем потерять. (данные приходят по COM порту, и проверок ни каких нет, эту часть писал не я и менять ничего не могу) |
обычно такая задача решается так: ставится таймер на 2-5 раз в секунду, и по его ивенту обновляется форма. 4 обновления в секунду - больше юзеру и не надо. 2 треда - нормальное решение, причем тред обработки имеет повышенный приоритет ( что-то там PRIORITY_CRITICAL - 15), a в отдельных случаях, необходимо повышать и выше, (хотя это опасно для винды). Я имею в виду надо повышать приоритет для треда обработки, а не понижать для формы.
По любому надо учитывать, что даже если потери пакетов не будет, сдвиг по времени неминуем. П.С. мне не совсем понятно зачем создавать форму в треде, ее надо лишь обновлять. И почему это нельзя ее создавать? |
Была такая же ситуация когда компы были еще P1-133 :biggrin:
Делали следующим образом. Писалось 2 программы: первая для получения данных с максимальным приоритетом, данные заносятся в файл буфер (формат какой удобнее хоть в текстовый, к тому же в винде есть такая фича как mem-файл, т.е. вроде и файл но в памяти, дисковые операции не используются, работает оч. быстро), вторая с минимальным приоритетом рисует и записывает данные уже в нормальную базу. Как прорисовка прошла, начинается новый цикл - данных уже несколько штук в буфере накопилось, считывает, очищает файл и пошел следующий цикл прорисовки и записи данных. Ни одного байта не пропадало. :beer: |
Часовой пояс GMT +4, время: 20:07. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.