Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Thread на KOL   Найти похожие ветки 

 
Clipper   (2003-06-02 22:42) [0]

Никак не могу догнать как работать с потоками в KOL.
На этом сайте есть пример работы с потоками в Delphi
(http://www.delphimaster.ru/articles/thread/index.html)
как сделать точно также с использованием KOL.
Покажите желательно на этом примере. Благодарю за ответ.


 
Gandalf ©   (2003-06-20 16:47) [1]

Посмотри UGH. А вообще, просто присвой Thread.Execute

while not Thread1.Terminate do
begin
 MyStreamDoSmth;
end;

А дальше создай поток (NewThread(False)) и все.


 
Skopin   (2003-07-06 12:50) [2]

Вот как раз я и не понял...
Во-превых не пойму как присвой Thread.OnExecute что либо, т.к. это свойство обхявлено так:

TOnThreadExecute = function(Sender:PThread): Integer of object;
 {* Event to be called when Execute method is called for TThread }

Я делаю так...
R := NewThread;
R.OnExecute := ..... вот здесь и трабла.. подскажите же фрагмет хортя бы кода и обхявления процедуры... не пойму никак...


 
Gandalf ©   (2003-07-06 12:53) [3]

Или

function TForm1.Thread1Execute(Sender: PThread): Integer;
begin
end;


Или

function Thread1Execute(Dummy:Pointer; Sender: PThread): Integer;
begin
end;


ЗЫ: Почему MCK не используешь?


 
Skopin   (2003-07-06 12:53) [4]

сорри за такое количество очепяток, сам не пойму чей-то я последнее время пишу черт знает как..


 
Skopin   (2003-07-06 12:54) [5]

тьфу... ну надо же!!! а я и не заметил что в MCK есть такой компонент!!
Спасибо большое....
(обратите внимание на время постов - прям как в чате)

Спасибо за оперативность!!!


 
Skopin   (2003-07-08 15:09) [6]

Снова возник вопрос про потоки....
Поместил на форму я компонент TThread. У него в событии OnExecute указал обработчик, считывающий в некий буфер 512 байт из потока...

И я в цикле каждый раз вызовом
Thread1.Execute;
вызываю этот поток... зачем? жду пока он или завершится, или если в течении какого-то времени не завершается, то вызываю Thread1.Terminate;

Проблема в том, что дальше вызова thread1.execute управление программой не доходит пока целиком не выполнится процедура OnExecute. Это плохо, т.к. если предположим наткнулись на сбойный фрагмент, то чтение может затянуться надолго, а мне его нудно прервать по таймеру. Вот оно...

Как всеж таки назначиит потоку "тело", которое выполнялось бы параллельно телу процедуры его активизировавшей? вот....

Спасибо!


 
mdw ©   (2003-07-08 16:22) [7]

Thread1.Execute; вызывать и не надо.
В зависимости от того чем его создавал, поток:
запустится сразу (NewThreadEx);
запустится приостановленным (NewThread), тогда нужно запустить Thread1.Resume;
запустится и разрушится (NewThreadAutoFree).
В MCK Это все определяется свойствами AutoFree и startSuspended.


 
Skopin   (2003-07-09 10:37) [8]

Снова вопрос возник...
У меня после остановки нити (Thread1.Suspend)
при последующем Thread1.Resume обработчик Thread1.OnExecute не вызывается! Может я просто не туда назначаю само тело нити? Или все дело в этом:

function TForm1.Thread1Execute(Sender: PThread): Integer;
begin
       BytesRead := FromFile.Read(Buf, BytesToRead);
       Thread1.Suspend;
end;

Ставлю breakpoint внутри этой процедуры - и она срабатывает только 1 раз - первый раз...
Т.е. вопрос, я правильно назначаю в OnExecute, то что должна выполнять нить (созданная MCK, startSuspended = TRUE, AutoFree = FALSE)?


 
Gandalf ©   (2003-07-09 15:42) [9]

Смотрю ты с потоками работать не умеешь... Класический поток это.

function TForm1.Thread1Execute(Sender: PThread): Integer;
begin
 while not Thread1.Terminated do
 begin
   MyWorkIterate;
 end;
end;

Т.е. почти бессконечный цикл. Suspend учыпляет поток где-то там внутри. Resume продолжает выполнение на приостоновленом месте - а если OnExecute дошел до конца - все готово, его уже Resume"ом не запустишь...
ЗЫ: Учим мат-часть.


 
Sagrer   (2003-07-14 16:28) [10]


> Проблема в том, что дальше вызова thread1.execute управление
> программой не доходит пока целиком не выполнится процедура
> OnExecute. Это плохо, т.к. если предположим наткнулись на
> сбойный фрагмент, то чтение может затянуться надолго


Вот примерно так...



FindInfoThread.Execute;
repeat
 Applet.ProcessMessages;
until WaitForSingleObject(FindInfoThread.Handle,0) <> Wait_Timeout;


 
Sagrer   (2003-07-16 02:36) [11]

Нда, у меня тоже проблема с потоками возникла... когда использую компонент, там все работает, видимо потому что там автоматически метод для OnExecute создается, а вот в невизуальном варианте что-то не получилось :( И немогу понять, что сделал неправильно, а мне очень нужно сделать thread именно невизуальный (для модуля, чтобы его использовать в других прогах).

Вот как поток делаю, и жду завершения его работы:



DirCopyThread := NewThread;
   DirCopyThread.AutoFree := true;
   DirCopyThread.OnExecute := TOnThreadExecute(MakeMethod(nil, @DirCopy));
   DirCopyThread.Execute;
   repeat
     If BarUpdated = true then begin
       InProcessF.ProgressBar1.MaxProgress := BarMax;
       InProcessF.ProgressBar1.Progress := BarPos;
     end;
     Applet.ProcessMessages;
   until WaitForSingleObject(DirCopyThread.Handle,0) <> Wait_Timeout;



Это для копирования папок, переменные BarUpdated, BarMax, BarPos обновляются внутри потока через synchronize.

Так вот проблема в том, что после вызова
DirCopyThread.Execute;
следующий оператор (repeat...) до завершения DirCopyThread.Execute; не выполняется :(

Dнутри функции DirCopy (которая метод для OnExecute) делаю метод, для synchronize... вот вообще вся эта функция :



Function DirCopy(Dummy:Pointer; Sender: PThread): Integer;
var
 CopyFrom : string;
 CopyTo : string;
 UseBar : boolean;

begin
 //Готовлю инфу
 CopyFrom := DirCopyInfo.CopyFrom;
 CopyTo := DirCopyInfo.CopyTo;
 UseBar := DirCopyInfo.UseBar;
 //Готовлю синхр-метод
 CopySynMethod := TThreadMethod(MakeMethod(nil,@CopySyn));
 DirCopyInfo.Result := DirCopyThr(CopyFrom,CopyTo,UseBar);
end;




Собственно потом уже функция DirCopyThr и выполняет все действия по копированию.

Ну вот - немогу понять, где у меня неправильно сделано (кстати, а есть ли мануал по использованию потоков на KOL (не тех что stream - этот я видел ;). И использовал в этом же модуле.  ).


 
SPeller ©   (2003-07-16 03:09) [12]


> Так вот проблема в том, что после вызова
> DirCopyThread.Execute;
> следующий оператор (repeat...) до завершения DirCopyThread.Execute;
> не выполняется :(

Ну что ты прям я не знаю :) Тебе же сказали: "Thread1.Execute вызывать и не надо."


> Снова вопрос возник...
> У меня после остановки нити (Thread1.Suspend)
> при последующем Thread1.Resume обработчик Thread1.OnExecute
> не вызывается!

Он и не должен вызываться. Есть обработчик OnResume.


Вот тебе пример создания потока без МСК:

fThread := NewThread; //создали объект потока в остановленном состоянии
fThread.OnExecute := OnExecute; //назначили процедуру, которая будет процедурой потока и поток завершится вместе с завершением процедуры
fThread.Resume; //запустили поток

или же это делается короче:

fThread := NewThreadEx( Result.OnExecute );

Другое:
fThread.Suspend - приостановить поток
fThread.Resume - запустить остановленный поток
fThread.OnSuspend - думаю, что понятен смысл обработчика
fThread.OnResume
fThread.WaitFor - возвращение из функции происходит после завершения потока fThread (вызывать надо из других потоков, например из главного)

PS: И не используй Synchronize - сначала прочитай его описание.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
1-1079460298
Shopot
2004-03-16 21:04
2004.04.04
Динамическая библьотека


1-1079437821
PaR
2004-03-16 14:50
2004.04.04
Работа с текстом...


1-1079598525
-= Evgen =-
2004-03-18 11:28
2004.04.04
ListBox1 -> ListBox2


1-1079699468
lika
2004-03-19 15:31
2004.04.04
StringList что не так?


3-1078931930
ser k
2004-03-10 18:18
2004.04.04
как программно поменять поля местами