![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread тормозит основную программу при выводе в мемо [D7, WinXP]
Alex_C © (2006-02-25 14:20:00)Проблема - надо в фоновом режиме принемать данные из инета и выводить их в мемо основной программы. Создаю нить. Принемаю данные - тут все ок! Но как только пытаюсь внутри ф-ции sinchronize нити вывести их в мемо основной формы - вся программа замирает на секунду - пока происходит вывод, потом работает далее.
Можно ли как то избавиться от этого?
MBo (2006-02-26 08:23:00) [1]>И в ней должны содержаться только операторы такого типа?
В общем - да.
Alex_C (2006-02-26 08:18:00) [2]Хорошо, я тогда задам более конкретный вопрос - что конкретно делает sinchronize? Я так понял - это как раз именно синхронизация вывода на форму? Т.е. она только для операторов типа Label.Caption := ... ? И в ней должны содержаться только операторы такого типа?
MBo (2006-02-26 06:44:00) [3]Сумбурно весьма, но вот это настораживает:
>Все это происходит в ф-ции synchronize
> все это тоже внутри ф-ции sinchronize
Метод потока, вызываемый через synchronize, должен содержать минимум работы - только передачу данных основному потоку.
Kolan (2006-02-25 23:55:00) [4]Alex_C © (25.02.06 22:27) [8]
Да не тут все просто - как писал ранее - команда - это установка на ком-порту сигналов RTS или DTR в 0 или 1 - так что тут проблем нет.
Ну понятно... Нахреня её из меме читать. Да еще и в потоке.
Устанавливать надо при возникновении какого-либо события. Мемо тут вообще ненужет как и доп поток.....
Возникло событие истановил...
А если хочешь поток, то используй Events. Пусть поток здет Event, как сличилось установил сигнал.....
Alex_C (2006-02-25 22:27:00) [5]Да не тут все просто - как писал ранее - команда - это установка на ком-порту сигналов RTS или DTR в 0 или 1 - так что тут проблем нет.
Kolan (2006-02-25 19:23:00) [6]С мемо счытываются постоянно комманды, которые посылаются на ком-порт. Заведует этим Thread2. И все это тоже внутри ф-ции sinchronize
Это же сколько комманд в секунду надо набрать в мемо?. В этом месте что-то явно нета. надо менять идею..
Скорее всего мемо ненкжен...
Alex_C (2006-02-25 19:04:00) [7]Чтоб не засорять кодом (тем более в данном случае он особого значения не имеет), приведу идеологию - думаю все сразу станет ясно.
Есть форма1 (на которую на Canvas из инета выводятся данные в Thread1) Все это происходит в ф-ции synchronize.
И есть форма2 с мемо (С мемо счытываются постоянно комманды, которые посылаются на ком-порт. Заведует этим Thread2. И все это тоже внутри ф-ции sinchronize).
Причем: более никто к этим формам из проги не обращается. Может тогда проще вообще отказаться от использования sinchronize, ведь синхронизироваться то не с кем? Но однако вывод на форму имется и это как бы получается "незащищенный код"?
MBo (2006-02-25 18:27:00) [8]>Можно ли как то избавиться от этого?
Да, если сделать синхронизацию правильно. Для приведенной модели, возможно, посредники необязательны , так что стоит привести код на рассмотрение.
Alex_C (2006-02-25 14:59:00) [9]Ок! Все ясно спасибо!
Alkid (2006-02-25 14:51:00) [10]Фишка в том, что раз у тебя одновременно работают два потока, которые
обращаются к одному объекту, то они могут одновременно к нему обратиться
(вызвать его методы). Одновременное исполнение двух методов одного объекта
может испортить его (например, есть у тебя список, по которому сейчас
"гуляет" метод поиска, вызванный в одном потоке, а в это вермя метод, вызванный в другом потоке удаляет из списка элементы).
Соответственно, необходимо сделать так, что бы во время вополнения метода
объекта в одном потоке вызов метода этого же объекта в другом блокировался пока в первом потоке метод не завершится. На этот случай есть множество
механизмов синхнронизации потоков. Посмотри про TCriticalSection.
Alex_C (2006-02-25 14:46:00) [11]To Alkid: Большое спасибо за ответ!
Идею в общем понятна.
Только 1 вопрос - поясни, пожайлуста, что значит "потокозащищенный класс"?
Alkid (2006-02-25 14:32:00) [12]Фишка в том, что Synchronize выполняет функцию в основном потоке приложения
и тем самым блокирует этот поток.
Можно применить следующую схему:
1. Пишешь потокозащищённый класс, являющийся посредником между
потоками. Типа очереди сообщений или типа того, не знаю точно какого рода
данные у тебя там курсируют.
2. В рабочем потоке, где тянешь данные из нета, докладываешь в объект-поредник данные.
3. В основном потоке устраивешь периодический опрос по таймеру объекта-посрелника и, если в нём есть новые данные, выбрасываешь их
на форму юзеру.
Схема может быть сильно усовершенствована, но общий принцип останется таким же.