Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2013, 18:50   #1
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
Хорошо Организация потока

Всем снова зрасьте, помогите разобраться с организацией потока
Посмотрел на просторах интернета простейшие конструкции создания потока, почти везде все такого вида:

объявление потока;
переменные;
процедура одна (для синхронизации);
Execute;

причем сказано, так, что, в Execute нужно писать сам код, а в процедуре в большинстве случаев в примерах это какойто (ShowResult) типо визуалиация. (progressBar.position := result). Ну это так в примерах пишут.


В моем случае все обстоит так. Вообще программа представляет из себя парсинг тем на форумах, код выкладывать не буду, но опишу максимально ясно.
У меня одна процедура, в которой и выполняется все что мне нужно. Вызов ее происходит по кнопке. Программа конечно не висит, т.к юзаются Application.Process.., но считаю что нужно все же поток сделать, итак что внутри процедуры:

1.запускается цикл со списком всех тем, из которых нужно сообщения получить
2. получаем первую ссылку, получаем исходный код страницы, режем названия тем, режем ссылки на темы
3. полученное выше записываем в БД
4. далее в базе идет проверка старых и новых тем. если есть новые темы
уже из базы я загоняю их в нужные места, ну и вижу их
5. ЗДЕСЬ происходит очистка Free всяких листов, зачистка следов и тд и все возвращается на первый пункт) и так до конца цикла.


Вот я и хочу спросить, как мне поступить с потоком, мои мысли такие:
вариант1. запихнуть просто название процедуры внутри Execute;
вариант2. внутри Execute написать Synchronize(название процедуры)
вариант3. разбить свою процедуру на 2 части, точнее убрать из процедуры код, где уже происходит получение данных сайта, нарезка и тп, а оставить в процедуре код где уже идет выгрузка из базы в компоненты.

тогда получится так:

внутри Execute пишем код который все тормозит, чуть ниже идет Synchronize(оставшаяся часть процедуры, с выгрузкой из БД)


Кто что скажет?

Последний раз редактировалось danka123; 28.09.2013 в 18:52.
danka123 вне форума Ответить с цитированием
Старый 28.09.2013, 19:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Кто что скажет?
По-моему верное направление: Поток. Exceute, содержащее основной цикл со sleep(10). В цикле закачиваются и парсятся сайты. То что напарсено попадает в свойство потока, которое потом записывается в базу из процедуры, вызванной с помошью Synchronize.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2013, 19:22   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

1. Не годится ни в коем случае.
2. Бессмысленно, ибо вся работа будет выполняться в главном потоке.
3. Правильный вариант. Только одно уточнение. Никто и ничто не запрещает вызывать метод Synchronize более одного раза в процедуре потока. Но лучше скомпоновать алгоритм визуализации так, чтобы тратить на нее как можно меньше времени.
northener вне форума Ответить с цитированием
Старый 28.09.2013, 19:41   #4
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
По умолчанию

А почему 2 бессмысленно?
Я конечно здесь спорить не готов, но считаю так:

взять тот же пример, где в мемо добавляли 60к строк в цикле, так вот там в Synchronize и попадала та процедура с текущим прогрессом.

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

или нет?)
danka123 вне форума Ответить с цитированием
Старый 28.09.2013, 20:28   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
почему тогда здесь нельзя в Synchronize поместить всю процедуру целиком??
Потому что этого нельзя делать не только здесь, но и вообще нигде и никогда! Потому что использование Synchronize это та обязательная плата, которую приходится платить за использование VCL, к компонентам которой можно обращаться только из главного потока приложения, что и делает метод Synchronize.

Цитата:
через месяцок в бд будет уже несколько тыс топиков, и если я их захочу вывести, получится тот же цикл как и с мемо, где я буду из бд по строке копировать все. и тогда получится что лагать станет не одно а другое
Хм. Если какой-то процесс/алгоритм требует для своего выполнения 10 минут, то он никак не сможет выполниться за 1 секунду в каком бы потоке его не вызывали.

Последний раз редактировалось northener; 28.09.2013 в 20:33.
northener вне форума Ответить с цитированием
Старый 28.09.2013, 20:32   #6
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
По умолчанию

Я понял. т.е тот код который внутри Execute Это главный поток, а ниже уже можно использовать Synchronize (в котором часть кода связанного с тем который в главном потоке) так?!
danka123 вне форума Ответить с цитированием
Старый 28.09.2013, 20:36   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Нет. Execute это тело дополнительного потока. И код в нем выполняется в дополнительном потоке, за исключением тех его фрагментов, которые "обернуты" в Synchronize.
northener вне форума Ответить с цитированием
Старый 28.09.2013, 20:42   #8
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
По умолчанию

я имел ввиду, то что находится в Execute связано с тем что внутри Synchronize.
т.е в Execute мы пишем код который должен вешать программу, а в Synchronize вывести результат, т.е что-то типо Application.ProcessMessage раздуплить
danka123 вне форума Ответить с цитированием
Старый 28.09.2013, 23:41   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
в Synchronize вывести результат
Только если вывод результата подразумевает обращение к компонентам VCL.
northener вне форума Ответить с цитированием
Старый 29.09.2013, 00:22   #10
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
По умолчанию

Я как раз это и хотел спросить) вы опередели. А если например мне просто нужно в переменную запихнуть исходный код 10ти сайтов, не выводя никуда эту переменную, тогда просто этот код выполнять в Execute и все?!
danka123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Перехват потока nordos Общие вопросы C/C++ 0 02.11.2011 17:43
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
Два потока tigrend Общие вопросы .NET 6 24.04.2010 08:25