Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.054 c
15-1232620643
Alkid
2009-01-22 13:37
2009.03.29
Исследование мыслительных процессов программистов


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


15-1232751624
Четыре
2009-01-24 02:00
2009.03.29
Компонент добавляющий в заголовок окна кнопку справа Помогите


15-1232747860
Городской Шаман
2009-01-24 00:57
2009.03.29
Wine на 100% поддерживает D7 и программы на нём.


2-1234238813
Программер
2009-02-10 07:06
2009.03.29
расшифровать кодировку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский