Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2 3 4 5 6

Тимоха ©   (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)
> Более подробное описание задачи потоков:

Села и честно пыталась понять что и как ты хочешь сделать.
Не сумела. Может попробовать пойти от простого к сложному ?
Напрмер, реализовать все без потоков. Потом отдельную задачу вынести в поток.
И т.д. ?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо