![]() |
| ||
|
|
Новости |
Поиск |
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-03 00:01:00) [41]мне не понятно почему неправильно держать эти строки в конструкторе потока?
Eraser (2009-02-02 23:52:00) [42]> [75] Тимоха (02.02.09 23:48)
можно и не так, можно и из вне, так понятнее.
Тимоха (2009-02-02 23:48:00) [43]если я правильно понял:
procedure TTest.Execute;
begin
Self.Priority := tpNormal;
Self.FreeOnTerminate := true;
...
end;
Но почему именно так?
Eraser (2009-02-02 23:44:00) [44]> [73] Тимоха (02.02.09 23:37)
> Когда тогда надо задавать приоритет?
в начале OnExecute.
> и выставлять freeonterminate?
где угодно, можно там же.
Тимоха (2009-02-02 23:37:00) [45]Когда тогда надо задавать приоритет? и выставлять freeonterminate?
Anatoly Podgoretsky (2009-02-02 23:18:00) [46]> Тимоха (02.02.2009 21:30:10) [70]
create выполняется в основном потоке.
Сергей М. (2009-02-02 21:55:00) [47]
> Тимоха (02.02.09 20:41) [68]
> Self.Priority := tpNormal;
> Self.FreeOnTerminate := true;
Опять "забыл" ?
теперь-то откуда скопировал ?)
Тимоха (2009-02-02 21:30:00) [48]сейчас в create потока.
Anatoly Podgoretsky (2009-02-02 21:29:00) [49]> Тимоха (02.02.2009 20:41:08) [68]
А у тебя где выполняется
Тимоха (2009-02-02 20:41:00) [50]
constructor Create(h: THandle; Url: string); overload;
constructor TTest.Create(h: THandle; Url: string);
begin
inherited Create(True);
FUrl := url;
hwnd := h;
Self.Priority := tpNormal;
Self.FreeOnTerminate := true;
http := TIdHTTP.Create(nil);
Resume;имеет разницу где выполнять поток, здесь или в мэйнтреде
end;
procedure TForm1.btn1Click(Sender: TObject);
var
potok: TTest;
begin
potok := TTest.create(form1.Handle, ' http://www.delphimaster.ru/cgi-bin/forum.pl?n=18');
end;
Palladin (2009-02-02 19:54:00) [51]бред. перепродумай. посмотри на конструктор потока (код конструктора выполняется в основном потоке), и посмотри что у тебя творится в btn1click. почувствуй бред )
Тимоха (2009-02-02 19:46:00) [52]Основной поток:
procedure TForm1.btn1Click(Sender: TObject);
var
potok: TTest;
begin
potok := TTest.Create(true);
potok.FreeOnTerminate := true;
potok.Priority := tpNormal;
potok.Main_handle := Form1.Handle;
potok.Url := ' http://www.delphimaster.ru/cgi-bin/forum.pl?n=18';
potok.Resume;
end;
procedure TForm1.handlenewdata(var message: TMessage);
var
data: PChar;
begin
data := PChar(Pointer(message.LParam)^);
lst1.Items.Add(data)
end;
Рабочий поток:
type
TTest = class(TThread)
private
http: tidhttp;
page: string;
FMain_handle: THandle;
FUrl: string;
{ Private declarations }
constructor create;
protected
procedure Execute; override;
public
property Url: string write FUrl;
property Main_handle: THandle write FMain_handle;
end;
implementation
constructor TTest.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
Self.Priority := tpNormal;
Resume;
end;
procedure TTest.Execute;
var
index, count: Integer;
s: PAnsiChar;
begin
http := TIdHTTP.Create(nil);
http.ProtocolVersion := pv1_1;
page := http.Get(FUrl);
count := 0;
index := PosEx('<nobr> ', page, count);
repeat
count := PosEx('', page, index);
GetMem(s, SizeOf(s));
s := PChar(Copy(page, index + 9, count - index - 9));
SendMessage(FMain_handle, wm_buf, 0, dword(@s));
index := PosEx('<nobr> ', page, count);
until index = 0;
http.Free;
end;
так нормально?
Anatoly Podgoretsky (2009-02-02 14:54:00) [53]> Тимоха (02.02.2009 11:29:36) [36]
Да ну, так и не приводят?
Сергей М. (2009-02-02 13:56:00) [54]
> что должно выступать в роли буфера
Например, свойства того самого объекта-потока
Медвежонок Пятачок (2009-02-02 13:52:00) [55]...
private
...
page: string;
....
Тимоха (2009-02-02 13:48:00) [56]Спасибо! А что должно выступать в роли буфера, через который будут добавляться данные в мэйн тред?
Сергей М. (2009-02-02 13:13:00) [57]
> Не понял как это будет выглядеть
Даже если не понял, то есть еще и событие TThread.OnTerminate - перед стартом потока назначь свой обработчик и в теле обработчика обращайся к объекту-потоку для считывания результатов его работы
Медвежонок Пятачок (2009-02-02 13:11:00) [58]Значит скачиванием страниц будет заниматься один поток.
Да хоть сто потоков пусть занимаются скачиванием.
Я тебе говорю про то, что классскачивающего потока должен быть один-единственный.
Тимоха (2009-02-02 13:08:00) [59]Почему пофиг, если процедур, которые должны параллельно парсить данные будет больше 1, то форма явно будет плохо откликаться пользователю. Значит скачиванием страниц будет заниматься один поток. А другие можно направить на анализ данных. Верно?
По поводу второго параметра конструктора, про метод. Не понял как это будет выглядеть.
Медвежонок Пятачок (2009-02-02 12:54:00) [60]пофик где они будут находится.
но они не должны находиться в потоке, скачивающем ресурс.