Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
ВнизОрганизация работы потоков Найти похожие ветки
← →
Тимоха (2009-02-02 08:20) [0]Написал программу, которая выполняет ряд некоторых функций.
Одни из которых это - связь с сайтом и получение от него определенной информации, анализ полученной информации, проверка наличия новых данных на том же сайте и их загрузка.
Необходимо реализовать работу функций программы с использованием потоков.
Более подробное описание задачи потоков:
При старте программы возможны два варианта:
(А).Программа запускается впервые,поэтому запускается поток ThrStartFirst. Этот поток скачивает с сайта страницу, парсит нужные данные и добавляет их в более расширенный компонент listbox(у листбокса есть свойства text,text1,text2,text3). В то время как работает ThrStartFirst, запускается следующий поток ThrStratAnalys, который берет по очереди каждый итем листбокса, вытаскивает свойство text и скачивает страницу с интернета, уже анализируя полученные данные и сохраняя в определенной структуре в файл.В это же время должен работать еще один поток ThrUpdate. Он скачивает всю туже страницу и наблюдает за появлением новых данных,удалением тех которые уже удалены с той страницы в интернете, и изменением каких то данных.( запускаться поток должен через определенное заданное время)
Вариант (В). Программа запущенна не впервые. В листбокс заносятся данные из сохраненных файлов(учитывая что вариант А полностью отработал в предыдущей загрузке, если нет то скачиваются файлы, которые не были скачаны в пером запуске А). Как только данные занесены, а это происходит весьма быстро так как файлы находяятся на диске в формате txt, то запускается поток ThrUpdate, выполняет те же операции что и в варианте А. Идеально было, если б таких ThrUpdate было больше одного(т.е.ThrUpdate1,2,3,4... которые выполняли свои функции с данными, не обязательно изменявшие данные в листбоксе).
Изучал работу критических секций,мьютексов, семафоров и других вариантов синхронизации. Но понять пока еще трудно. Надеюсь на помощь в создании алгоритмов. Надеюсь услышать советы: что лучше использовать в моем случае, на что обратить внимание.
P.S. Программа будет работать с моим сайтом. Для скачивания содержимого страниц используется idhttp.
Заранее благодарен.
← →
Сергей М. © (2009-02-02 08:25) [1]
> понять пока еще трудно
Что конкретно ?
← →
Тимоха (2009-02-02 08:30) [2]Перед тем как начать писать программу с потоками, надо определить схему: какие потоки будут, как будут взаимодействовать и т.д. Пока трудности со схемой. Ну и с реализацией тоже.
← →
Тимоха (2009-02-02 08:41) [3]Для реализации поставленной задачи критической секции хватит? Хочется чтобы программа работала без ошибок (в плане потоков), и потоки правильно освобождались.
← →
KSergey © (2009-02-02 08:46) [4]сразу отказываемся от всяких листбоксов для хранения информации, тем более межпоточной.
Собственно основное на что надо обращать внимание: чтобы
а) одни и те же данные не модифицировались из разных потоков одновременно; если надо модифицировать из разных потоков - обкладываем объектами сихронизации.
б) один поток не читал еще не готовые полностью данные другого потока; хотя это отчасти разновидность пункта а)
Объекты синхронизации вибираем по месту, сказать "вообще" - невозможно, ина че бы их не было столько разнообразных.
Всегда вибираем самые "легкие" из тех, что подходят для конкретной задачи.
← →
Сергей М. © (2009-02-02 08:53) [5]
> Для реализации поставленной задачи критической секции хватит?
Если исключить потенциальную возможность обращений доп.потоков к визуальным VCL-контролам, то, возможно, и хватит.
← →
Тимоха (2009-02-02 09:33) [6]Listbox служит выводом информации для пользователя, как я могу от него отказаться:))))))))))
← →
Сергей М. © (2009-02-02 09:39) [7]
> Тимоха (02.02.09 09:33) [6]
А никто и не заставляет тебя от него отказываться.
Вопрос в том, что доп.тредам в условиях VCL-приложения крайне нежелательно знать ни про какие листбоксы и прочие UI-контролы.
← →
Медвежонок Пятачок © (2009-02-02 09:40) [8](А).Программа запускается впервые,поэтому запускается поток ThrStartFirst. Этот поток скачивает с сайта страницу, парсит нужные данные и добавляет их в более расширенный компонент listbox(у листбокса есть свойства text,text1,text2,text3). В то время как работает ThrStartFirst, запускается следующий поток ThrStratAnalys, который берет по очереди каждый итем листбокса, вытаскивает свойство text и скачивает страницу с интернета, уже анализируя полученные данные и сохраняя в определенной структуре в файл.В это же время должен работать еще один поток ThrUpdate. Он скачивает всю туже страницу и наблюдает за появлением новых данных,удалением тех которые уже удалены с той страницы в интернете, и изменением каких то данных.( запускаться поток должен через определенное заданное время)
Дурь несусветная.
Три разных потока-близнеца "скачивают страницы с инета"
← →
Медвежонок Пятачок © (2009-02-02 09:45) [9]Надеюсь услышать советы: что лучше использовать в моем случае, на что обратить внимание.
что имеенно использовать - неважно.
главное перестать использовать свой генератор дури и воспользоваться мозгом.
← →
Тимоха (2009-02-02 09:59) [10]Медвежонок Пятачок ,я не претендую на статус прошаренного. Поэтому и пишу в форуме для начинающих. Прошу писать по теме. О генераторе дури можем поговорить в разделе "Прочее". Если есть дельные мысли по тому как правильней сделать, можете написать здесь - не стесняйтесь. Я вам буду только благодарен.
> Сергей М
Использовать буфер для хранения данных, а затем vcl потоком вытаскивать из буфера данные?
← →
Сергей М. © (2009-02-02 10:01) [11]
> Тимоха (02.02.09 09:59) [10]
Это уж как угодно.
← →
Медвежонок Пятачок © (2009-02-02 10:02) [12]чтобы услышать дельные мысли, надо внятные вопросы задавать, а не просто туманно рассуждать "а что бы такое-етакое позаковыристее мне написать ?"
в чем конкретная проблема твоя?
← →
Тимоха (2009-02-02 10:20) [13]Не могу продумать последовательность работы потоков и выбрать правильный метод синхронизации для моей задачи.
← →
Медвежонок Пятачок © (2009-02-02 10:21) [14]С этим не сюда. С этим к терапевту.
← →
Медвежонок Пятачок © (2009-02-02 10:24) [15]последовательность работы потоков
потоки могут работать непоследовательно.
если их заставить работать последовательно, то от потоков можно вообще отказаться и оставить единственный поток.
← →
Тимоха (2009-02-02 10:31) [16]Ок. Имел ввиду параллельность.
← →
Riply © (2009-02-02 10:40) [17]> [0] Тимоха (02.02.09 08:20)
> Более подробное описание задачи потоков:
Села и честно пыталась понять что и как ты хочешь сделать.
Не сумела. Может попробовать пойти от простого к сложному ?
Напрмер, реализовать все без потоков. Потом отдельную задачу вынести в поток.
И т.д. ?
← →
Медвежонок Пятачок © (2009-02-02 10:40) [18]а теперь спроси себя, зачем тебе три разных класса потоков, которые на 90% делают одно и тоже
← →
Тимоха (2009-02-02 10:47) [19]Riply, вообщем то так и делаю. Сначала сделал без потоков. Теперь пытаюсь с ними.
Медвежонок Пятачок, потоки скачивают разные страницы, и делают разные парсинги и анализы.
← →
Медвежонок Пятачок © (2009-02-02 10:49) [20]Понятно.
Чернила для седьмого класса. Чернила для седьмого класса "Б" и чернила для седьмого класса "Б" для вторника.
← →
Медвежонок Пятачок © (2009-02-02 10:51) [21]а если вдруг требуется поддержка прокси, то трудолюбиво переколбашиваем все три класса.
а чо, времени у студента вагон, и старость за горами.
← →
Тимоха (2009-02-02 10:57) [22]вот код, который запускает поток:
Thread_Start_First := TThread_Start_First.Create;
Thread_Start_First.FreeOnTerminate := True;
try
with Thread_Start_First do
begin
OnTerminate := HandleTerminate;
Resume;
end;
except on EConvertError do
begin
Thread_Start_First.Free;
ShowMessage("ERROR");
end;
end;
← →
Медвежонок Пятачок © (2009-02-02 11:03) [23]из кода видно, что потоку ничего не передается в качестве параметров.
то есть он "знает" урл с которого качать, знает куда совать выкачанные данные и так далее.
за такое структурирование кода надо давать пожизненный эцих с гвоздями с конфискацией компьютера.
← →
Сергей М. © (2009-02-02 11:06) [24]
> Тимоха (02.02.09 10:57) [22]
>
Плохой код. Очень плохой.
← →
Anatoly Podgoretsky © (2009-02-02 11:06) [25]> Тимоха (02.02.2009 10:57:22) [22]
И гадай Вася, что там за ошибка.
← →
Медвежонок Пятачок © (2009-02-02 11:09) [26]Зачем гадать? У нас же есть суперинформативное
ShowMessage("ERROR");
← →
Сергей М. © (2009-02-02 11:12) [27]
> Тимоха (02.02.09 10:57) [22]
Ты вообще-то задумывался над тем, кто-что и по каким причинам может возбудить искл-е EConvertError при выполнении тех операторов, которые у тебя фигурируют в with-блоке ?
← →
Riply © (2009-02-02 11:18) [28]> [22] Тимоха (02.02.09 10:57)
Хотела было тебя съесть с потрохами за этот код,
но подумала, вдруг другие тоже голодные и не стала :)
← →
Сергей М. © (2009-02-02 11:22) [29]
> Riply © (02.02.09 11:18) [28]
Колобка на всех хватит)
← →
Тимоха (2009-02-02 11:22) [30]поток создается так
constructor TThread_Start_First.Create;
begin
inherited Create(True); //Созданный поток создается в приостановленном состоянии
FreeOnTerminate := True; //Поток освободит ресурсы при окончании работы
Self.Priority := tpNormal; //Очень высокий приоритет
Resume;
end;procedure TThread_Start_First.Execute;
begin
...
syncronize(get_page);
...
syncronize(updateresults);
end;
procedure TThread_Start_First.get_page;
begin
Page := HTTP.Get(URL);
end;
procedure TThread_Start_First.updateresults;
begin
form1.listbox1.items.add(...);
...
end;
← →
Сергей М. © (2009-02-02 11:24) [31]
> Тимоха (02.02.09 11:22) [30]
Тихий ужас.
Тяжелое наследие Архангельского.
← →
Тимоха (2009-02-02 11:24) [32]Ладно, как должен выглядеть код правильно?
← →
Медвежонок Пятачок © (2009-02-02 11:25) [33]Ууууу.....................
А сам поток-то зачем тогда?
← →
Медвежонок Пятачок © (2009-02-02 11:26) [34]не. срочно к терапевту, или лучше сразу в морг.
← →
Сергей М. © (2009-02-02 11:27) [35]
> Тимоха (02.02.09 11:24) [32]
> как должен выглядеть код правильно?
Ты не ответил на [27].
Бессмысленно рассуждать о "правильности", если ты не хочешь думать самостоятельно.
← →
Тимоха (2009-02-02 11:29) [36]уууууу- так работает мотор))))))
Про Архангельского не раз видел плохие отзывы, но при этом никто "правильного" кода не приводит :(Potok := TThread.Create(true);
Potok.FreeOnTerminate := true;
Potok.Priority := tpLowest;
Potok.Resume;
так будет вернее?
← →
Тимоха (2009-02-02 11:31) [37]
> Сергей М
Приложение делает попытку ошибочного преобразования целых чисел, чисел с плавающей запятой, дат или времени в строку или ошибочного преобразования строк в эти типы
← →
Сергей М. © (2009-02-02 11:31) [38]
> Тимоха (02.02.09 11:29) [36]
см. [27]
Пока не ответишь, дальше не поедем.
← →
Сергей М. © (2009-02-02 11:32) [39]
> Тимоха (02.02.09 11:31) [37]
Еще раз прочитай вопрос в [27] !
← →
Тимоха (2009-02-02 11:34) [40]Задумывался. В моем случае ничто и никто.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.053 c