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

Вниз

TThread тормозит основную программу при выводе в мемо   Найти похожие ветки 

 
Alex_C ©   (2006-02-25 14:20) [0]

Проблема - надо в фоновом режиме принемать данные из инета и выводить их в мемо основной программы. Создаю нить. Принемаю данные - тут все ок! Но как только пытаюсь внутри ф-ции sinchronize нити вывести их в мемо основной формы - вся программа замирает на секунду - пока происходит вывод, потом работает далее.
Можно ли как то избавиться от этого?


 
Alkid ©   (2006-02-25 14:32) [1]

Фишка в том, что Synchronize выполняет функцию в основном потоке приложения
и тем самым блокирует этот поток.
Можно применить следующую схему:
1. Пишешь потокозащищённый класс, являющийся посредником между
потоками. Типа очереди сообщений или типа того, не знаю точно какого рода
данные у тебя там курсируют.
2. В рабочем потоке, где тянешь данные из нета, докладываешь в объект-поредник данные.
3. В основном потоке устраивешь периодический опрос по таймеру объекта-посрелника и, если в нём есть новые данные, выбрасываешь их
на форму юзеру.

Схема может быть сильно усовершенствована, но общий принцип останется таким же.


 
Alex_C ©   (2006-02-25 14:46) [2]

To Alkid: Большое спасибо за ответ!
Идею в общем понятна.
Только 1 вопрос - поясни, пожайлуста, что значит "потокозащищенный класс"?


 
Alkid ©   (2006-02-25 14:51) [3]

Фишка в том, что раз у тебя одновременно работают два потока, которые
обращаются к одному объекту, то они могут одновременно к нему обратиться
(вызвать его методы). Одновременное исполнение двух методов одного объекта
может испортить его (например, есть у тебя список, по которому сейчас
"гуляет" метод поиска, вызванный в одном потоке, а в это вермя метод, вызванный в другом потоке удаляет из списка элементы).

Соответственно, необходимо сделать так, что бы во время вополнения метода
объекта в одном потоке вызов метода этого же объекта в другом блокировался пока в первом потоке метод не завершится. На этот случай есть множество
механизмов синхнронизации потоков. Посмотри про TCriticalSection.


 
Alex_C ©   (2006-02-25 14:59) [4]

Ок! Все ясно спасибо!


 
MBo ©   (2006-02-25 18:27) [5]

>Можно ли как то избавиться от этого?
Да, если сделать синхронизацию правильно. Для приведенной модели, возможно, посредники необязательны , так что стоит привести код на рассмотрение.


 
Alex_C ©   (2006-02-25 19:04) [6]

Чтоб не засорять кодом (тем более в данном случае он особого значения не имеет), приведу идеологию - думаю все сразу станет ясно.
Есть форма1 (на которую на Canvas из инета выводятся данные в Thread1) Все это происходит в ф-ции synchronize.
И есть форма2 с мемо (С мемо счытываются постоянно комманды, которые посылаются на ком-порт. Заведует этим Thread2. И все это тоже внутри ф-ции sinchronize).
Причем: более никто к этим формам из проги не обращается. Может тогда проще вообще отказаться от использования sinchronize, ведь синхронизироваться то не с кем? Но однако вывод на форму имется и это как бы получается "незащищенный код"?


 
Kolan ©   (2006-02-25 19:23) [7]

С мемо счытываются постоянно комманды, которые посылаются на ком-порт. Заведует этим Thread2. И все это тоже внутри ф-ции sinchronize

Это же сколько комманд в секунду надо набрать в мемо?. В этом месте что-то явно нета. надо менять идею..

Скорее всего мемо ненкжен...


 
Alex_C ©   (2006-02-25 22:27) [8]

Да не тут все просто - как писал ранее - команда - это установка на ком-порту сигналов RTS или DTR в 0 или 1 - так что тут проблем нет.


 
Kolan ©   (2006-02-25 23:55) [9]

Alex_C ©   (25.02.06 22:27) [8]
Да не тут все просто - как писал ранее - команда - это установка на ком-порту сигналов RTS или DTR в 0 или 1 - так что тут проблем нет.


Ну понятно... Нахреня её из меме читать. Да еще и в потоке.
Устанавливать надо при возникновении какого-либо события. Мемо тут вообще ненужет как и доп поток.....

Возникло событие истановил...

А если хочешь поток, то используй Events.  Пусть поток здет Event, как сличилось установил сигнал.....


 
MBo ©   (2006-02-26 06:44) [10]

Сумбурно весьма, но вот это настораживает:
>Все это происходит в ф-ции synchronize
> все это тоже внутри ф-ции sinchronize

Метод потока, вызываемый через synchronize, должен содержать минимум работы - только передачу данных основному потоку.


 
Alex_C ©   (2006-02-26 08:18) [11]

Хорошо, я тогда задам более конкретный вопрос - что конкретно делает sinchronize? Я так понял - это как раз именно синхронизация вывода на форму? Т.е. она только для операторов типа Label.Caption := ... ? И в ней должны содержаться только операторы такого типа?


 
MBo ©   (2006-02-26 08:23) [12]

>И в ней должны содержаться только операторы такого типа?
В общем - да.



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
1-1140425629
kyn66
2006-02-20 11:53
2006.03.26
Почему SpeedButton меняет свой цвет ?


2-1141837878
Volkodav
2006-03-08 20:11
2006.03.26
Перетаскивание формы


15-1141060496
I am
2006-02-27 20:14
2006.03.26
Оптимальный вариант проверки подлинности


11-1105701338
Bil Bal Dur
2005-01-14 14:15
2006.03.26
использование памяти


2-1141973054
Елена
2006-03-10 09:44
2006.03.26
Работа с динамическими компонентами