Форум: "KOL";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.048 c