Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1078924395
Petr V. Abramov
2004-03-10 16:13
2004.04.04
За что аборигены съели Кука?


6-1075135863
kor@l
2004-01-26 19:51
2004.04.04
HTTP


3-1078470164
bushmen
2004-03-05 10:02
2004.04.04
ADOStoredProc


1-1079522596
zolg
2004-03-17 14:23
2004.04.04
Packages и иже с ним...


6-1074686084
IgoX
2004-01-21 14:54
2004.04.04
ClientSocket1Disconnect





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский