Главная страница
    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.043 c
10-1115220240
Evloev Oleg
2005-05-04 19:24
2006.03.26
Многопоточность и COM


2-1142138454
ученик1
2006-03-12 07:40
2006.03.26
Структура TSearchRec


2-1141984134
Van
2006-03-10 12:48
2006.03.26
Площадь многогранника


2-1141675431
mrAndersen
2006-03-06 23:03
2006.03.26
текст (пожалуйста помогите)


1-1140431192
Pit
2006-02-20 13:26
2006.03.26
Процессы





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