![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Организация работы потоков
Тимоха © (2009-02-02 08:20:00)Написал программу, которая выполняет ряд некоторых функций.
Одни из которых это - связь с сайтом и получение от него определенной информации, анализ полученной информации, проверка наличия новых данных на том же сайте и их загрузка.
Необходимо реализовать работу функций программы с использованием потоков.
Более подробное описание задачи потоков:
При старте программы возможны два варианта:
(А).Программа запускается впервые,поэтому запускается поток ThrStartFirst. Этот поток скачивает с сайта страницу, парсит нужные данные и добавляет их в более расширенный компонент listbox(у листбокса есть свойства text,text1,text2,text3). В то время как работает ThrStartFirst, запускается следующий поток ThrStratAnalys, который берет по очереди каждый итем листбокса, вытаскивает свойство text и скачивает страницу с интернета, уже анализируя полученные данные и сохраняя в определенной структуре в файл.В это же время должен работать еще один поток ThrUpdate. Он скачивает всю туже страницу и наблюдает за появлением новых данных,удалением тех которые уже удалены с той страницы в интернете, и изменением каких то данных.( запускаться поток должен через определенное заданное время)
Вариант (В). Программа запущенна не впервые. В листбокс заносятся данные из сохраненных файлов(учитывая что вариант А полностью отработал в предыдущей загрузке, если нет то скачиваются файлы, которые не были скачаны в пером запуске А). Как только данные занесены, а это происходит весьма быстро так как файлы находяятся на диске в формате txt, то запускается поток ThrUpdate, выполняет те же операции что и в варианте А. Идеально было, если б таких ThrUpdate было больше одного(т.е.ThrUpdate1,2,3,4... которые выполняли свои функции с данными, не обязательно изменявшие данные в листбоксе).
Изучал работу критических секций,мьютексов, семафоров и других вариантов синхронизации. Но понять пока еще трудно. Надеюсь на помощь в создании алгоритмов. Надеюсь услышать советы: что лучше использовать в моем случае, на что обратить внимание.
P.S. Программа будет работать с моим сайтом. Для скачивания содержимого страниц используется idhttp.
Заранее благодарен.
Сергей М. (2009-02-02 11:31:00) [81]
> Тимоха (02.02.09 11:29) [36]
см. [27]
Пока не ответишь, дальше не поедем.
Тимоха (2009-02-02 11:29:00) [82]уууууу- так работает мотор))))))
Про Архангельского не раз видел плохие отзывы, но при этом никто "правильного" кода не приводит :(
Potok := TThread.Create(true);
Potok.FreeOnTerminate := true;
Potok.Priority := tpLowest;
Potok.Resume;
так будет вернее?
Сергей М. (2009-02-02 11:27:00) [83]
> Тимоха (02.02.09 11:24) [32]
> как должен выглядеть код правильно?
Ты не ответил на [27].
Бессмысленно рассуждать о "правильности", если ты не хочешь думать самостоятельно.
Медвежонок Пятачок (2009-02-02 11:26:00) [84]не. срочно к терапевту, или лучше сразу в морг.
Медвежонок Пятачок (2009-02-02 11:25:00) [85]Ууууу.....................
А сам поток-то зачем тогда?
Сергей М. (2009-02-02 11:24:00) [86]
> Тимоха (02.02.09 11:22) [30]
Тихий ужас.
Тяжелое наследие Архангельского.
Тимоха (2009-02-02 11:24:00) [87]Ладно, как должен выглядеть код правильно?
Сергей М. (2009-02-02 11:22:00) [88]
> Riply © (02.02.09 11:18) [28]
Колобка на всех хватит)
Тимоха (2009-02-02 11:22:00) [89]поток создается так
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;
Riply (2009-02-02 11:18:00) [90]> [22] Тимоха (02.02.09 10:57)
Хотела было тебя съесть с потрохами за этот код,
но подумала, вдруг другие тоже голодные и не стала :)
Сергей М. (2009-02-02 11:12:00) [91]
> Тимоха (02.02.09 10:57) [22]
Ты вообще-то задумывался над тем, кто-что и по каким причинам может возбудить искл-е EConvertError при выполнении тех операторов, которые у тебя фигурируют в with-блоке ?
Медвежонок Пятачок (2009-02-02 11:09:00) [92]Зачем гадать? У нас же есть суперинформативное
ShowMessage('ERROR');
Сергей М. (2009-02-02 11:06:00) [93]
> Тимоха (02.02.09 10:57) [22]
>
Плохой код. Очень плохой.
Anatoly Podgoretsky (2009-02-02 11:06:00) [94]> Тимоха (02.02.2009 10:57:22) [22]
И гадай Вася, что там за ошибка.
Медвежонок Пятачок (2009-02-02 11:03:00) [95]из кода видно, что потоку ничего не передается в качестве параметров.
то есть он "знает" урл с которого качать, знает куда совать выкачанные данные и так далее.
за такое структурирование кода надо давать пожизненный эцих с гвоздями с конфискацией компьютера.
Тимоха (2009-02-02 10:57:00) [96]вот код, который запускает поток:
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 10:51:00) [97]а если вдруг требуется поддержка прокси, то трудолюбиво переколбашиваем все три класса.
а чо, времени у студента вагон, и старость за горами.
Медвежонок Пятачок (2009-02-02 10:49:00) [98]Понятно.
Чернила для седьмого класса. Чернила для седьмого класса "Б" и чернила для седьмого класса "Б" для вторника.
Тимоха (2009-02-02 10:47:00) [99]Riply, вообщем то так и делаю. Сначала сделал без потоков. Теперь пытаюсь с ними.
Медвежонок Пятачок, потоки скачивают разные страницы, и делают разные парсинги и анализы.
Riply (2009-02-02 10:40:00) [100]> [0] Тимоха (02.02.09 08:20)
> Более подробное описание задачи потоков:
Села и честно пыталась понять что и как ты хочешь сделать.
Не сумела. Может попробовать пойти от простого к сложному ?
Напрмер, реализовать все без потоков. Потом отдельную задачу вынести в поток.
И т.д. ?