Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обработать потоки


Автор: DIMONSOFT 25.7.2008, 21:59
На форме находится 3 memo. В первом мемо, к примеру, 100 строк. Нужно обработать поочередно каждую строку через поток(в зависимости от этого, она переместится из мемо1 в мемо2 или мемо3)

Создаю потоки:

Код

createthread(nil,1024,@sort1,self,0,h1);
createthread(nil,1024,@sort2,self,0,h2);
createthread(nil,1024,@sort3,self,0,h3);


Код процедур(одинаковый):
Код

  procedure sort1(p:pointer);
  var
  otvet: string;
  site: string;
  begin

  site:=TForm5(p).memo1.Lines[0];
  TForm5(p).memo1.Lines.Delete(0);
  otvet:=GetUrl('http://sms-anonim.net/seo/xor.php?link='+site);
  if otvet='ok' then TForm5(p).memo2.Lines.Add(site);
  if otvet='no' then TForm5(p).memo3.Lines.Add(site);

  ExitThread(h1);
  end;

  procedure sort2(p:pointer);
  var
  otvet: string;
  site: string;
  begin
  site:=TForm5(p).memo1.Lines[0];
  TForm5(p).memo1.Lines.Delete(0);
  otvet:=GetUrl('http://sms-anonim.net/seo/xor.php?link='+site);
  if otvet='ok' then TForm5(p).memo2.Lines.Add(site);
  if otvet='no' then TForm5(p).memo3.Lines.Add(site);
  ExitThread(h2);
  end;

  procedure sort3(p:pointer);
  var
  otvet: string;
  site: string;
  begin
  site:=TForm5(p).memo1.Lines[0];
  TForm5(p).memo1.Lines.Delete(0);
  otvet:=GetUrl('http://sms-anonim.net/seo/xor.php?link='+site);
  if otvet='ok' then TForm5(p).memo2.Lines.Add(site);
  if otvet='no' then TForm5(p).memo3.Lines.Add(site);
  ExitThread(h3);
  end;


Как лучше обрабатывать каждую строку, если мне нужно 10 потоков? Т.е., после обработки строки, свободный поток должен начать обрабатывать следующую и т.д. Сейчас процедуры обрабатывают первые 3 строки. У кого какие идеи?

Автор: Riply 25.7.2008, 23:53
Цитата(DIMONSOFT @  25.7.2008,  21:59 Найти цитируемый пост)
Как лучше обрабатывать каждую строку, если мне нужно 10 потоков?


Увидев первые строчки кода, собралась затянуть свою старую песню про Handl`ы,
но случайно скользнула взглядом ниже, и увидела процедуру sort1 ...


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

Добавлено через 3 минуты и 13 секунд
P.S.
 Там даже есть грозное предупреждение прямо в заголовке: "Не используйте потоки, не прочитав это"  smile 

Автор: DIMONSOFT 26.7.2008, 16:19
Вот нашел пример:
Код

unit unit1;

interface

uses
windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls;

type
tform1 = class(tform)
memo1: tmemo;
button1: tbutton;
procedure button1click(sender: tobject);
private
{ private declarations }
public
{ public declarations }
end;

tnew = class(tthread)
private
s: string;
procedure addstr;
protected
procedure execute; override;
end;

var
form1: tform1;
new1, new2: tnew;

implementation

{$r *.dfm}

procedure tform1.button1click(sender: tobject);
begin
new1 := tnew.create(true);
new1.freeonterminate := true;
new1.s := '1 thread';
new1.priority := tplowest;
new2 := tnew.create(true);
new2.freeonterminate := true;
new2.s := '2 thread';
new2.priority := tptimecritical;
new1.resume;
new2.resume;
end;

{ tnew }
procedure tnew.addstr;
begin
form1.memo1.lines.add(s);
sleep(2);
form1.memo1.lines.add(s);
sleep(2);
form1.memo1.lines.add(s);
sleep(2);
form1.memo1.lines.add(s);
sleep(2);
form1.memo1.lines.add(s);
end;

procedure tnew.execute;
begin
synchronize(addstr); // Вызов метода с синхронизацией
//addstr; // Вызов метода без синхронизации
end;

end. 


Токо никак не могу понять,  как записать этот код в tnew.addstr smile 

Код

site:=TForm5(p).memo1.Lines[0];
  TForm5(p).memo1.Lines.Delete(0);
  otvet:=GetUrl('http://sms-anonim.net/seo/xor.php?link='+site);
  if otvet='ok' then TForm5(p).memo2.Lines.Add(site);
  if otvet='no' then TForm5(p).memo3.Lines.Add(site);

Автор: Riply 27.7.2008, 12:22
Цитата(DIMONSOFT @  26.7.2008,  16:19 Найти цитируемый пост)
Вот нашел пример


Ну что ж. Уже лучше.
Но налицо явная нехватка базовых знаий в других вопросах.
Почитай еще про классы. Посмотри как они реализуются, например, в "генофонде".
Плюс к этому, в Demos, есть отличный пример работы с классом TThread.
Если не ошибаюсь, он (пример) так и называется "TThread".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)