Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работаем с Thread-ми , очень нужно [D6, WinXP]


Страницы:   1 2

ctranik ©   (2005-03-07 14:58:00) 

Всем привет

Требуется передавать данные во время работы ПОТОКА.

Предположим, что превоначально в этот ПОТОК загрузили текст
из компонента " Memo1 " (обычный текст).
Теперь содержимое компонента " Memo1 " изменилось(а поток-то работает!!! ).

Как новые данные загрузить в работающий ПОТОК ?


ctranik   (2005-03-08 12:01:00) [21]


> Набережных С

Жаль что непобалуеш, моё решение я не ХАЛЯВЩИК.
Я нуждающийся в практическом совете.

ВОТ как выглядит моя нужда

Код Кнопки

MyThread.Editlist.Assign(memo3.Lines);//присваеваем потоку содержимое html-файла
MyThread.webpath:=WebPath;//путь до html-файла
My.resume;


Procedure Form1.Сreate

Mythread:=TmyThread.reta(true);


а вот и модуль потока


unit MyThread;

interface

uses
 Classes,Podprogramy;

type
 TMyThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;

 public
  Editlist:TstringList;
  webpath:string;
  constructor Create(CreateSuspended: Boolean);
  destructor Destroy; override;

 end;

implementation
uses offline;// модуль главной программы

procedure TMyThread.Execute;
label 1;
var
j,u,k,f,v,l :integer;
stroka,newstroka,url,CloseTeg,Attr:string;

begin
if editlist.Count=0 then suspended:=true;
v:=length('<a');
for j:=0 to editlist.Count-1 do begin
for u:=1 to length(EditList.Strings[j]) do begin
  Attr:=''; CloseTeg:='';
//Тут ищем вхождение ТЕГА "<a" или "<A"  
if (copy(EditList.Strings[j],u,v)='<a')or(copyEditList.Strings[j],u,v)='<A')then begin
   stroka:=copy(EditList.Strings[j],u+v,length(EditList.Strings[j])-u);
// Тут ищем закрывающий тег
   if pos('</a>',stroka)>0 then CloseTeg:='</a>'
   else
   if pos('</A>',stroka)>0 then CloseTeg:='</A>';
   if CloseTeg<>'' then  begin
    l:=pos(CloseTeg,stroka);
    stroka:=copy(stroka,1,l);
   end;
// тут ищем аттрибут тега "HREF='" или " href=' "
   if pos('href="',stroka)>0 then Attr:='href="'
    else
   if pos('HREF="',stroka)>0 then  Attr:='HREF="' ;
    if Attr<>'' then begin
    f:=length(Attr);
    newstroka:= copy(stroka,pos(Attr,stroka)+f,length(stroka)-(pos(Attr,stroka)+f));
    if pos('"',newstroka)>0 then newstroka:=copy(newstroka,1,pos('"',newstroka)-1);
    end
     else newstroka:='';
// эта функция для удаление ненужных слов (обязательна)
   if IgnorList(newstroka)=false then continue;
    if pos('/',newstroka)=1 then newstroka:=copy(newstroka,2,length(newstroka)-pos('/',newstroka));
//тут создаётся готовый URL    
url:=webpath+newstroka;
//И проверяется на наличие среди уже закаченных файлов
     for k:=0 to form1.LinksList.Count-1 do begin
      if url=form1.LinksList.Strings[k]then goto 1;
     end;
    form1.LinksList.Add(url);
  end;
end;
1:end;
editlist.Clear;

end;

constructor TMyThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
 Editlist := TStringList.Create;
end;

destructor TMyThread.Destroy;
begin
 Editlist.Free;
 inherited;
end;

end.



Хочу подчеркнуть что код метода "Execute" правильно работает,
просто он второй раз незапускается


Erik1   (2005-03-08 10:41:00) [22]

Кода в инете дофига, поищи в gogle TThread Delphi синхронизация потоков и пр..


Набережных С.   (2005-03-08 10:25:00) [23]


> ctranik   (08.03.05 10:09) [6]

Нет, не побалую. Информации для решения у тебя достаточно, осталось думать и реализовывать. Это и есть работа программиста, а не халявщика. Кем ты хочешь быть - решай сам. Я вот, например, халявщиков не люблю, так уж в жизни сложилось. Ну будут конкретные вопросы - делаю вот так, но выходит не то, что хочу, а то-то и то-то - милости просим.


ctranik   (2005-03-08 10:09:00) [24]


> Набережных С

Хорошо написал, если бы меня только теория интересовала , то я бы был более менне удовлетворён. НО!?

Я пишу прогу для скачивания сайтов, и загружая в этот ПОТОК компонент " MEMO" где хранится текст мною скачиного html-файла , и надо что бы в этом ПОТОКЕ прога находила html-теги типа "<a href='", а потом всё что нашла возвращала в ОСНОВНУЮ ПРОГУ
А как-ты понимаеш скачивать придется неодин фаил , то значит и ПОТОК должен работать неодин раз.

P.S. Может каким КОДОМ побалуеш, плиз


Набережных С.   (2005-03-08 09:49:00) [25]

Существуют две разные сущности - дельфийский объект TThread и системный объект THREAD. Дельфийский - самый обыкновенный объект, такой же, как и любой другой. Он при своем создании путем вызова WinApi функции CreateThread создает объект системный и связывает с ним некоторый код, частью которого является код процедуры TThread.Execute. Теперь, когда будет предоставлять процессорное время объекту THREAD, будет исполняться именно этот код.

Если ты создаешь дельфийский объект с параметром в конструкторе TRUE, функция CreateThread будет вызвана с установленным флагом CREATE_SUSPENDED. Это значит, что системный объект будет создан, с ним будет связан код, но исполняться этот код не будет. Поток будет "спать". После вызова метода Resume система будет считать, что поток разбужен и будет предоставлять ему возможность использовать процессор в порядке очередности с другими потоками.

Допустим, у нас есть несколько равноправных потоков, каждому из которых есть что делать, а процессор только один. С каждым потоком связан собственный код, который в общем случае никак не связан с кодом других потоков. Процессор не может одновременно выполнять две разные команды. Для того, чтобы каждый поток смог выполнить свою работу, система периодически "забирает" процессор у одного потока и отдает его другому. Т.е. некоторое время исполняется код только одного потока, остальные ждут своей очереди. На многопроцессорной машине происходит то же самое, принципиальных отличий нет, просто в каждый момент времени могут исполняться несколько потоков, по числу процессоров.

Смысл существования системного объекта THREAD - выполнение связанного с ним кода. Как только этот код завершился, функции объекта THREAD выполнены. Он еще продолжает существовать, пока где хранятся неосвобожденные ссылки на него, но вновь запустить исполнение связанног с ним кода он не может. Код исплняется только раз.

Дельфийский TThread как раз и удерживает одну из ссылок на THREAD. Это позволяет в одном месте хранить, например, результаты работы потока или получить его код завершения. Если этого нам не надо, то мы можем установить флаг FreeOnTerminate и тогда TThread сам себя уничтожит как только завершится, грубо говоря, метод Execute.

Так как поток может быть предназначен для циклической работы, не одноразовой, то он не должен до определенного момента завершать свое исполнение. Для этого в потоке организуется цикл. В этом случае в какой-то момент нужно извне сообщить коду потока, что ему пора завершаться. Одним из способов такого оповещения как раз и служит свойство Terminated и метод Terminate, которые обращаются к одному внутреннему полю.


ctranik   (2005-03-08 08:16:00) [26]


> Юрий Зотов

Привет
обьясни пожалуйсто, вот когда поток один раз выполнился , он чё после этого разрушается что ли ?

И ещё для использования "Terminate", в теле метода " Execute "
надо весь код поместить в конструкцию

while not Terminated do begin
.....//тут какй-то код
end;

а в событие OnClick кнопки написать следущие

mythread.create(true);  //поток создан но невыполняется
...//тут какой-то код
...//тут какой-то код
mythread.resume;        //запускаем
mythread.terminate;   //а тут мы его разрушаем , правильно ???


ответь пожалуйсто на вопросы, а то честно говоря уже забодался
с этими потоками.


Erik1   (2005-03-07 16:58:00) [27]

Наверное тебе необходима синхронизация с потоком для передачи и приема? Тогда глянь на критеческие секции и события. TCriticalSection TEvent.


DiamondShark   (2005-03-07 15:33:00) [28]

Ни разу не понятно, что значит "загрузить данные в поток".


Юрий Зотов   (2005-03-07 15:11:00) [29]

Варианты:
1. Suspend - загрузка_данных - Resume.
2. Terminate - запуск_нового_потока_с_новыми_данными.

И еще много чего можно придумать. Надо знать детали задачи.


Страницы:   1 2

Наверх

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