imho.ws |
![]() |
![]() |
![]() |
# 1 |
Member
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348
![]() ![]() ![]() |
Форма в отдельном потоке
День добрый всем!
Стоит следующая задача: Есть программа получающая данные от прибора и эти данные нужно отображать на графике. Получение данных критично ко времени, а перерисовка графики часто занимает больше времени чем интервал между приходом отдельных пакетов данных, соответственно происходит сдвиг пакетов по времени или их потеря, а это недопустимо. Поэтому есть идея вынести отображение графики в отдельный поток и пониженным приоритетом. Но как я понимаю создавать форму в отдельном потоке нельзя. Соответственно возникает вопрос, как можно это решить? Делать форму через WinApi не охота, больно уж гимморойно, может есть еще какое-то решение? добавлено через 31 минуту Да, забыл написать, пишу в Delphi.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я |
![]() |
![]() |
# 3 |
Member
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348
![]() ![]() ![]() |
PSyton
Отображать данные в процессе их получения тоже необходимо и нужно сделать, чтобы отображение не мешало получению. А поскольку сейчас все происходит в контексте одного потока, то может произойти такой случай (на медленном компе например), между получением каких-то пакетов данных программа решит перерисовать график и не успеет это сделать до прихода следующего пакета, соответственно его мы можем потерять. (данные приходят по COM порту, и проверок ни каких нет, эту часть писал не я и менять ничего не могу)
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я |
![]() |
![]() |
# 4 |
Full Member
Регистрация: 11.12.2002
Сообщения: 864
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
обычно такая задача решается так: ставится таймер на 2-5 раз в секунду, и по его ивенту обновляется форма. 4 обновления в секунду - больше юзеру и не надо. 2 треда - нормальное решение, причем тред обработки имеет повышенный приоритет ( что-то там PRIORITY_CRITICAL - 15), a в отдельных случаях, необходимо повышать и выше, (хотя это опасно для винды). Я имею в виду надо повышать приоритет для треда обработки, а не понижать для формы.
По любому надо учитывать, что даже если потери пакетов не будет, сдвиг по времени неминуем. П.С. мне не совсем понятно зачем создавать форму в треде, ее надо лишь обновлять. И почему это нельзя ее создавать? Последний раз редактировалось crawler; 06.06.2008 в 18:24. |
![]() |
![]() |
# 5 |
Junior Member
Регистрация: 25.09.2003
Сообщения: 53
![]() |
Была такая же ситуация когда компы были еще P1-133
![]() Делали следующим образом. Писалось 2 программы: первая для получения данных с максимальным приоритетом, данные заносятся в файл буфер (формат какой удобнее хоть в текстовый, к тому же в винде есть такая фича как mem-файл, т.е. вроде и файл но в памяти, дисковые операции не используются, работает оч. быстро), вторая с минимальным приоритетом рисует и записывает данные уже в нормальную базу. Как прорисовка прошла, начинается новый цикл - данных уже несколько штук в буфере накопилось, считывает, очищает файл и пошел следующий цикл прорисовки и записи данных. Ни одного байта не пропадало. ![]() |
![]() |