Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
14-1081353939
DDA
2004-04-07 20:05
2004.05.02
Прикол2


1-1082130461
Zorlag
2004-04-16 19:47
2004.05.02
Плавное появление формы на экране


14-1081538326
pirat
2004-04-09 23:18
2004.05.02
наблюдение любопытного


3-1080988684
race1
2004-04-03 14:38
2004.05.02
integer overflow в гриде


14-1081339441
sHinE
2004-04-07 16:04
2004.05.02
C какими БД работает дельфи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский