IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Форма в отдельном потоке (http://www.imho.ws/showthread.php?t=132997)

lyuq 06.06.2008 12:30

Форма в отдельном потоке
 
День добрый всем!

Стоит следующая задача:
Есть программа получающая данные от прибора и эти данные нужно отображать на графике.
Получение данных критично ко времени, а перерисовка графики часто занимает больше времени чем интервал между приходом отдельных пакетов данных, соответственно происходит сдвиг пакетов по времени или их потеря, а это недопустимо.
Поэтому есть идея вынести отображение графики в отдельный поток и пониженным приоритетом. Но как я понимаю создавать форму в отдельном потоке нельзя. Соответственно возникает вопрос, как можно это решить? Делать форму через WinApi не охота, больно уж гимморойно, может есть еще какое-то решение?

добавлено через 31 минуту
Да, забыл написать, пишу в Delphi.

PSyton 06.06.2008 16:12

Не надо форму в отдельном потоке.
просто нужно выставлять флаг. когда данные еще рисуются и если он выставлен, то не обновлять форму...

lyuq 06.06.2008 16:41

PSyton
Отображать данные в процессе их получения тоже необходимо и нужно сделать, чтобы отображение не мешало получению. А поскольку сейчас все происходит в контексте одного потока, то может произойти такой случай (на медленном компе например), между получением каких-то пакетов данных программа решит перерисовать график и не успеет это сделать до прихода следующего пакета, соответственно его мы можем потерять. (данные приходят по COM порту, и проверок ни каких нет, эту часть писал не я и менять ничего не могу)

crawler 06.06.2008 18:22

обычно такая задача решается так: ставится таймер на 2-5 раз в секунду, и по его ивенту обновляется форма. 4 обновления в секунду - больше юзеру и не надо. 2 треда - нормальное решение, причем тред обработки имеет повышенный приоритет ( что-то там PRIORITY_CRITICAL - 15), a в отдельных случаях, необходимо повышать и выше, (хотя это опасно для винды). Я имею в виду надо повышать приоритет для треда обработки, а не понижать для формы.
По любому надо учитывать, что даже если потери пакетов не будет, сдвиг по времени неминуем.

П.С. мне не совсем понятно зачем создавать форму в треде, ее надо лишь обновлять. И почему это нельзя ее создавать?

sflash 19.06.2008 10:39

Была такая же ситуация когда компы были еще P1-133 :biggrin:
Делали следующим образом. Писалось 2 программы: первая для получения данных с максимальным приоритетом, данные заносятся в файл буфер (формат какой удобнее хоть в текстовый, к тому же в винде есть такая фича как mem-файл, т.е. вроде и файл но в памяти, дисковые операции не используются, работает оч. быстро), вторая с минимальным приоритетом рисует и записывает данные уже в нормальную базу. Как прорисовка прошла, начинается новый цикл - данных уже несколько штук в буфере накопилось, считывает, очищает файл и пошел следующий цикл прорисовки и записи данных. Ни одного байта не пропадало. :beer:


Часовой пояс GMT +4, время: 20:07.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.