Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Проблема с потоками   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
4-1078333980
Rustamus
2004-03-03 20:13
2004.05.02
Доступ к системе


1-1081786751
hgd
2004-04-12 20:19
2004.05.02
Вопрос про группу


7-1077518181
SDW-syscoder
2004-02-23 09:36
2004.05.02
Нулевое кольцо защиты (Ring0)


3-1080912855
FireStorm
2004-04-02 17:34
2004.05.02
Как подключиться к БД MYSQL в Дельфи?


14-1081401047
syte_ser78
2004-04-08 09:10
2004.05.02
чистка лсд экранчиков