Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

Организация работы потоков   Найти похожие ветки 

 
Тимоха   (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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.029 c
3-1217238791
Fynjy
2008-07-28 13:53
2009.03.29
как вручную создать TIBDataBase


1-1209030616
psa247
2008-04-24 13:50
2009.03.29
multiselect stringgrid


15-1232784590
Кое кто
2009-01-24 11:09
2009.03.29
Чем читать файл *.RM?


4-1207574719
IIIaMaH
2008-04-07 17:25
2009.03.29
Свойства Папки


6-1200853816
Gbp
2008-01-20 21:30
2009.03.29
Странная трабла моего локального прокси с гуглом