![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 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. |
![]() |
![]() |
![]() |
#2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#3 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]()
1. Не годится ни в коем случае.
2. Бессмысленно, ибо вся работа будет выполняться в главном потоке. 3. Правильный вариант. Только одно уточнение. Никто и ничто не запрещает вызывать метод Synchronize более одного раза в процедуре потока. Но лучше скомпоновать алгоритм визуализации так, чтобы тратить на нее как можно меньше времени. |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 26.09.2012
Сообщений: 29
|
![]()
А почему 2 бессмысленно?
Я конечно здесь спорить не готов, но считаю так: взять тот же пример, где в мемо добавляли 60к строк в цикле, так вот там в Synchronize и попадала та процедура с текущим прогрессом. почему тогда здесь нельзя в Synchronize поместить всю процедуру целиком?? сейчас на первом этапе вешает программу idhttp и прочий код, а если я в настройках не уберу хранить историю, то через месяцок в бд будет уже несколько тыс топиков, и если я их захочу вывести, получится тот же цикл как и с мемо, где я буду из бд по строке копировать все. и тогда получится что лагать станет не одно а другое ![]() или нет?) |
![]() |
![]() |
![]() |
#5 | ||
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]() Цитата:
Цитата:
Последний раз редактировалось northener; 28.09.2013 в 20:33. |
||
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 26.09.2012
Сообщений: 29
|
![]()
Я понял. т.е тот код который внутри Execute Это главный поток, а ниже уже можно использовать Synchronize (в котором часть кода связанного с тем который в главном потоке) так?!
|
![]() |
![]() |
![]() |
#7 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]()
Нет. Execute это тело дополнительного потока. И код в нем выполняется в дополнительном потоке, за исключением тех его фрагментов, которые "обернуты" в Synchronize.
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 26.09.2012
Сообщений: 29
|
![]()
я имел ввиду, то что находится в Execute связано с тем что внутри Synchronize.
т.е в Execute мы пишем код который должен вешать программу, а в Synchronize вывести результат, т.е что-то типо Application.ProcessMessage раздуплить ![]() |
![]() |
![]() |
![]() |
#9 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 26.09.2012
Сообщений: 29
|
![]()
Я как раз это и хотел спросить) вы опередели. А если например мне просто нужно в переменную запихнуть исходный код 10ти сайтов, не выводя никуда эту переменную, тогда просто этот код выполнять в Execute и все?!
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как получить доступ к методу потока(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 |