Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизПроблема с потоками Найти похожие ветки
← →
MikePol (2004-04-13 09:37) [0]Есть поток который опрашивает устройство и по PostMessage посылает сообщение MDI формам. По этому сообщению происходит обновление Сontrol-ов на формах. Синхронизирую через критические секции. Приоритет потока обновляющего устройство, Highest. Проблема заключается в том, что при создании, перемещении, нажатии кнопки на MDI форме , обновляющий поток приостонавливаеися (не выполняется какое то время), из за чего происходит потеря данных.
Как избежать этой проблемы ? Может кто-нибудь подскажет другой способ организации ?
← →
pasha_golub © (2004-04-13 09:55) [1]Ну, вообще Виндоуз не real-time ОС, быть может в этом проблема?
← →
panov © (2004-04-13 09:56) [2]>MikePol (13.04.04 09:37)
1. Без кода трудно что-либо сказать.
2. ПРи обновлении способом посылки сообщений использование критических секций не требуется.
← →
MikePol (2004-04-13 10:12) [3]На сообщение стоит обработчик который считывает данные из свойств объектов которые обновляются потоком, а потом выводит их(данные) на MDI форму.
Поток обновления :
while not Terminated do
begin
MyCS.Enter; // MyCS - TCriticalSection
DoUpdate; // обновление данных устройства
MyCS.Leave;
i:=0;
while i<MainFOrm.MDIChildCount do
PostMessage(MainForm.MDIChildren[i].Handle,WM_USER,0,0);
sleep(10);
end;
Обработчик сообщения :
procedure TChildForm.WMUSER(var a: TWMNoParams);
begin
Indicator1.Image:=Data.CurrentDataStr;
// Indicator - контрол на форме
// Data содержит ссылку на обновляющийся объект
// CurrentDataStr возвращает поле обновляющегося объекта
// синхронизация в самой функции
end;
← →
MikePol (2004-04-13 11:02) [4]?
← →
Jack128 © (2004-04-13 11:17) [5]>>Проблема заключается в том, что при создании, перемещении, нажатии >>кнопки на MDI форме ,
А все эти действия имеют какое то отнашение к потоку?? может у тя для перерисовки какие то данные из потока дергуются??
А в принципе, насчет организации, как долго выполняется DoUpdate?
Если прилично, то может имеет смысл проводить этот метод вне критической секции, а уже результаты сохранять в какой нить переменной, доступ к которой осуществлять через CS? Тогда внутри CS окажется меньше кода..
← →
pasha_golub © (2004-04-13 11:26) [6]yCS.Leave;
i:=0;
while i<MainFOrm.MDIChildCount-1 do //!!!
PostMessage(MainForm.MDIChildren[i].Handle,WM_USER,0,0);
sleep(10);
end;
← →
MikePol (2004-04-13 11:28) [7]Все действия с формой не зависят от потока.
DoUpdate < 1 ms
Я не понимаю почему при перерисовке формы (или удержания мыши на рамке) поток тормозит ...
← →
pasha_golub © (2004-04-13 11:30) [8]И ваапще, на фига эти переборы в потоке?
while not Terminated do
begin
MyCS.Enter; // MyCS - TCriticalSection
DoUpdate; // обновление данных устройства
MyCS.Leave;
MainForm.BroadCast(...);
//sleep(10); вот это, тоже здесь, ИМХО, лишнее
end;
← →
pasha_golub © (2004-04-13 11:31) [9]Хотя, нет был не прав. Это ж поток, прошу прощения за pasha_golub © (13.04.04 11:30) [8]
← →
Jack128 © (2004-04-13 11:32) [10]
> DoUpdate < 1 ms
Чего???? Ну так ты бы хоть на каждой десятой(а лудше сотой(!!)) итерации обновлял формы бы хоть...Ты каждые 10 мс (с учетом sleep"a) формы обновляешь.. Есстественно у тя все тормозит по полной...
← →
han_malign © (2004-04-13 11:39) [11]
while i<MainFOrm.MDIChildCount do //!!!
PostMessage(MainForm.MDIChildren[i].Handle,WM_USER,0,0);
- надеюсь это описка - хотя, обожаю вечные циклы...(верне, пока открыта хоть одна MDIChild)
← →
han_malign © (2004-04-13 11:42) [12]>Ну так ты бы хоть на каждой десятой(а лудше сотой(!!)) итерации обновлял формы бы хоть...
- поддерживаю - все таки, хорошим тоном считается слать нотификацию, только при реальном изменении данных, а не по таймауту.
← →
MikePol (2004-04-13 11:45) [13]Да это описка, там inc(i) вторым оператором
← →
panov © (2004-04-13 12:00) [14]У тебя при такой огромной очереди сообщений некоторые из них просто теряются.
← →
MikePol (2004-04-13 12:55) [15]Да теряются ... и пускай . Мне главное чтобы обновлялось быстро,
а с выводом можно и через 50 мс. Только обновляющий поток все-равно тормозит при открытии, сворачивании, и самое противное что при нажатии кнопки мыши на рамке формы.
← →
Jack128 © (2004-04-13 13:01) [16]Ну посмотри, где конкретно он(поток) тормозит, на каком операторе.. Хотя чует мое сердце, что он CS ждет, а основной поток её в это время "запирает"..
← →
panov © (2004-04-13 14:56) [17]Обрати внимание на процедуру Canvas.Lock, Может быть, и поможет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c