Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c