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-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]

пофик где они будут находится.
но они не должны находиться в потоке, скачивающем ресурс.


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

Наверх

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