|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.10.2014, 14:26 | #1 |
Пользователь
Регистрация: 07.10.2014
Сообщений: 10
|
Проблема синхронизации потоков
Здравствуйте.
После нескольких лет пользования tidHttp появилось желание вынести загрузку (а точнее команду http.get(...)) в поток, а в перспективе вообще перейти на компонент Synapse. Написал фрагмент программы для работы с потоками. Бросил на форму кнопку Button1 и текстовое поле Memo1. Написал следующий код двумя модулями: Код:
Код:
Последний раз редактировалось vahdorf; 07.10.2014 в 15:28. |
07.10.2014, 14:57 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,432
|
Что-то не понимаю что вы сделть-то хотите.
Создали доп. поток, в execute повесили его на 3 секунды, в ОСНОВНОМ потоке повесили основной поток с помощью WaitFor и продолжаете думать что все хорошо. Увы нет Опишите задачу. |
07.10.2014, 15:13 | #3 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Для начала:
Код:
I'm learning to live...
|
07.10.2014, 15:19 | #4 |
Пользователь
Регистрация: 07.10.2014
Сообщений: 10
|
Сейчас поставил перед собой такую задачу - вынести функцию загрузки страниц (команду idhttp.get(...)) в отдельный поток; и как только очередная страница загружена, обработать полученный текст; при этом может сразу поступить несколько команд на загрузку страниц.
(Метод onterminate для обработки результата не подходит, так как в дальнейшем этот поток-загрузчик будет использоваться для разного типа данных и вызываться из разных участков программы) PS. sleep(3000) - это для теста, а так там будет загрузка текста страницы по переданному fURL (idhttp.get(fURL)), которая может занимать до нескольких секунд. Последний раз редактировалось vahdorf; 07.10.2014 в 15:25. |
07.10.2014, 15:24 | #5 |
Пользователь
Регистрация: 07.10.2014
Сообщений: 10
|
Про синхронизацию вывода текста в лог полностью согласен. Но ведение лога сейчас вообще не требуется, добавил эти строчки лишь для теста, чтобы увидеть что поток выполнил все операции, но в основную программу не дал сигнал завершения своей работы.
|
07.10.2014, 17:13 | #6 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,537
|
Цитата:
И Вызываться она будет из одно и того же места (по завершении работы метода потока Excute). и выполняться она будет ВНЕ потока(т.е. в основном потоке) и потому она не требует синхронизации. Каждому из созданных тобою потоков (даже если они будут одного типа) ты вправе назначить свою собственную процедуру, при условии что они(эти процедуры) будут написаны. Цитата:
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 07.10.2014 в 17:19. |
||
07.10.2014, 17:39 | #7 | |
Пользователь
Регистрация: 07.10.2014
Сообщений: 10
|
Цитата:
Писать функции MyStopThread для каждого получаемого из интернета типа данных очень не хотелось бы... |
|
08.10.2014, 10:14 | #8 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,537
|
Цитата:
Цитата:
поток САМ знает когда ему вызвать MyStopThread. Ничего специально ждать не надо. Но сможет он это сделать только во время "простоя" основного. В твоем случае после окончания того самого цикла while not ... (точнее процедуры в которой он был заведен).
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 08.10.2014 в 10:23. |
||
08.10.2014, 11:29 | #9 |
Пользователь
Регистрация: 07.10.2014
Сообщений: 10
|
Мой вопрос сводится к следующему принципиальному моменту:
сейчас алгоритм работы основной функции такой - предварительное формирование данных для запроса, сам запрос в интернет (Idhttp.get) и обработка полученных данных. Можно ли поместить Idhttp.get в поток, не разделяя единый алгоритм на две функции? Чтобы, как минимум, Idhttp.get не подвешивал сейчас программу (IdAntiFreeze не всегда помогает) а в последствие перейти на компонент от Synapse (там антифриза вообще нет никакого). Последний раз редактировалось vahdorf; 08.10.2014 в 16:50. |
08.10.2014, 16:48 | #10 |
Пользователь
Регистрация: 07.10.2014
Сообщений: 10
|
Кстати еще вопрос по данной структуре построения потоков. Я так понял переменная text в данном случае будет глобальной? Не получится ли тогда рассинхрона при параллельном запуске нескольких потоков, когда один поток занес в переменную s='execute' а второй в этот момент изменяет ее на s='finish' и оба вызывают функцию syncfunc? Что добавится в этом случае в memo1?
Последний раз редактировалось vahdorf; 08.10.2014 в 16:50. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Synchronize, Критические секции, другие варианты, что лучше для синхронизации потоков? | bilibian | Общие вопросы Delphi | 15 | 04.03.2014 10:57 |
Проблема синхронизации WinAPI потоков | Vadik(R) | Общие вопросы Delphi | 1 | 13.01.2014 01:27 |
AccessVolation при синхронизации потоков | hiho | Общие вопросы Delphi | 2 | 27.10.2012 08:29 |
Проблема синхронизации потоков | Teor | Общие вопросы .NET | 4 | 17.06.2011 15:50 |
Реализация функций синхронизации потоков. | натка | Помощь студентам | 1 | 03.01.2008 15:26 |