imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 06.06.2008, 12:30     # 1
lyuq
Member
 
Аватар для lyuq
 
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348

lyuq Молодецlyuq Молодецlyuq Молодец
Форма в отдельном потоке

День добрый всем!

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

добавлено через 31 минуту
Да, забыл написать, пишу в Delphi.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я
lyuq вне форума  
Старый 06.06.2008, 16:12     # 2
PSyton
Junior Member
 
Аватар для PSyton
 
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187

PSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форуме
Не надо форму в отдельном потоке.
просто нужно выставлять флаг. когда данные еще рисуются и если он выставлен, то не обновлять форму...
__________________
Дураки не динозавры - они не вымрут...
PSyton вне форума  
Старый 06.06.2008, 16:41     # 3
lyuq
Member
 
Аватар для lyuq
 
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348

lyuq Молодецlyuq Молодецlyuq Молодец
PSyton
Отображать данные в процессе их получения тоже необходимо и нужно сделать, чтобы отображение не мешало получению. А поскольку сейчас все происходит в контексте одного потока, то может произойти такой случай (на медленном компе например), между получением каких-то пакетов данных программа решит перерисовать график и не успеет это сделать до прихода следующего пакета, соответственно его мы можем потерять. (данные приходят по COM порту, и проверок ни каких нет, эту часть писал не я и менять ничего не могу)
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я
lyuq вне форума  
Старый 06.06.2008, 18:22     # 4
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

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

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

Последний раз редактировалось crawler; 06.06.2008 в 18:24.
crawler вне форума  
Старый 19.06.2008, 10:39     # 5
sflash
Junior Member
 
Аватар для sflash
 
Регистрация: 25.09.2003
Сообщения: 53

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


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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