Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
6-1134645753
Plastic Angel
2005-12-15 14:22
2006.03.26
Indy in Depth....?


9-1126594429
WondeRu
2005-09-13 10:53
2006.03.26
OpenGL. Вывод одновременно растрового и векторного шрифтов. Как?


2-1142085774
хочу все знать
2006-03-11 17:02
2006.03.26
изменение диапазона цикла FOR внутри цикла


2-1141644435
Junior1
2006-03-06 14:27
2006.03.26
Прочитать файл в массив


2-1141668485
Vitaly73
2006-03-06 21:08
2006.03.26
mp3-проигрыватель





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский