Организация потока

Всем снова зрасьте, помогите разобраться с организацией потока Посмотрел на просторах интернета простейшие конструкции создания потока, почти везде все такого вида:объявление потока; переменные; процедура одна (для синхронизации); Execute;причем сказано, так, что, в Execute нужно писать сам код, а в процедуре в большинстве случаев в примерах это какойто (ShowResult) типо визуалиация. (progressBar.position := result). Ну это так в примерах пишут.В моем случае все обстоит так. Вообще программа представляет из себя парсинг тем на форумах, код выкладывать не буду, но опишу максимально ясно. У меня одна процедура, в которой и выполняется все что мне нужно. Вызов ее происходит по кнопке. Программа конечно не висит, т.к юзаются Application.Process.., но считаю что нужно все же поток сделать, итак что внутри процедуры:1.запускается цикл со списком всех тем, из которых нужно сообщения получить 2. получаем первую ссылку, получаем исходный код страницы, режем названия тем, режем ссылки на темы 3. полученное выше записываем в БД 4. далее в базе идет проверка старых и новых тем. если есть новые темы уже из базы я загоняю их в нужные места, ну и вижу их 5. ЗДЕСЬ происходит очистка Free всяких листов, зачистка следов и тд и все возвращается на первый пункт) и так до конца цикла.Вот я и хочу спросить, как мне поступить с потоком, мои мысли такие: вариант1. запихнуть просто название процедуры внутри Execute; вариант2. внутри Execute написать Synchronize(название процедуры) вариант3. разбить свою процедуру на 2 части, точнее убрать из процедуры код, где уже происходит получение данных сайта, нарезка и тп, а оставить в процедуре код где уже идет выгрузка из базы в компоненты.тогда получится так:внутри Execute пишем код который все тормозит, чуть ниже идет Synchronize(оставшаяся часть процедуры, с выгрузкой из БД)Кто что скажет?
9 ответов

Кто что скажет?
По-моему верное направление: Поток. Exceute, содержащее основной цикл со sleep(10). В цикле закачиваются и парсятся сайты. То что напарсено попадает в свойство потока, которое потом записывается в базу из процедуры, вызванной с помошью Synchronize.


1. Не годится ни в коем случае. 2. Бессмысленно, ибо вся работа будет выполняться в главном потоке. 3. Правильный вариант. Только одно уточнение. Никто и ничто не запрещает вызывать метод Synchronize более одного раза в процедуре потока. Но лучше скомпоновать алгоритм визуализации так, чтобы тратить на нее как можно меньше времени.


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


почему тогда здесь нельзя в Synchronize поместить всю процедуру целиком??
Потому что этого нельзя делать не только здесь, но и вообще нигде и никогда! Потому что использование Synchronize это та обязательная плата, которую приходится платить за использование VCL, к компонентам которой можно обращаться только из главного потока приложения, что и делает метод Synchronize.
через месяцок в бд будет уже несколько тыс топиков, и если я их захочу вывести, получится тот же цикл как и с мемо, где я буду из бд по строке копировать все. и тогда получится что лагать станет не одно а другое
Хм. Если какой-то процесс/алгоритм требует для своего выполнения 10 минут, то он никак не сможет выполниться за 1 секунду в каком бы потоке его не вызывали.


Я понял. т.е тот код который внутри Execute Это главный поток, а ниже уже можно использовать Synchronize (в котором часть кода связанного с тем который в главном потоке) так?!


Нет. Execute это тело дополнительного потока. И код в нем выполняется в дополнительном потоке, за исключением тех его фрагментов, которые "обернуты" в Synchronize.


я имел ввиду, то что находится в Execute связано с тем что внутри Synchronize. т.е в Execute мы пишем код который должен вешать программу, а в Synchronize вывести результат, т.е что-то типо Application.ProcessMessage раздуплить


в Synchronize вывести результат
Только если вывод результата подразумевает обращение к компонентам VCL.


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