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

Вниз

Thread, ну не пойму я!   Найти похожие ветки 

 
CooL   (2002-12-23 16:04) [0]

Прошу прощения возможно за идиотский вопрос, но все таки кто нибудь подскажет как грамотно использовать TKolThread? Обьясняю, в качестве примера: создаю форму(само собой Kol-project), на форме KolEditBox и кнопку KolButton, кидаю на форму KolThread свойства которого по умолчанию. В событии OnExecute простой счетчик(for .. to .. do) с выводом переменной цикла в KolEditBox, в событии кнопки OnClik что я должен написать, что бы этот самый OnExecute выполнялся при каждом нажатии на кнопку?! И что бы это было действительно Thread?
Ну не работает это так как должно, по моим понятиям!

Очень может быть, что я чего то не понимаю, pls раз"ясните.


 
Vladimir Kladov   (2002-12-26 10:45) [1]

Resume. В OnExecute должно быть что-то вроде:

while not WantTerminate do
begin
for i := 0 to 100 do
begin
end;
Thread1.Suspend;
end

Перед завершением надо установить WantTerminate в true и сказать
Thread1.Resume еще раз. Желательно еще обеспечить передачу управления потоку, чтобы он мог выйти из своего цикла до того, как потребуется его разрушить. Для этого достаточно Sleep( 0 ); Если неизвестно наверняка, выполняется поток в этот момент или заморожен, совсем правильно выполнить простой цикл ожидания:

WantTerminate := true;
Thread1.Resume;
Attemts := 10;
while not Thread1.Terminated and (Attempts > 0) do
begin
Sleep( 0 );
Dec( Attempts );
end;

Если в цикле делается что-то большое, то желательно постоянно
проверять WantTerminate. Если это невозможно, и время выхода из цикла угадать никак нельзя, завершение без проверки приведет к
принудительному разрушению потока без освобождения выделенных
ресурсов. Если это NT, и программа уже завершается, то это
несущественно. Если 9х, и ресурсов немного, то при завершении
программы это тоже несущественно.


 
CooL   (2002-12-26 12:41) [2]

Владимир, все понятно, но вопрос не в том, что написать в OnExecute, а как выполнить это несколько раз? Возможно я не совсем правильно ставлю вопрос, но VCL-Thread я могу запускать хоть 10 раз подряд и всегда это Thread, а вот KolThread почему-то после первой отработки в дальнейшем перестает быть таковым.


 
Vladimir Kladov   (2002-12-27 10:28) [3]

Resume. Точно так же, как и в VCL. Если в VCL вызывать Execute, то его код будет выполняться в том потоке, из которого его вызвали. Так что и в VCL надо использовать Resume. Не верите? Перечитайте справку по VCL.TThread.


 
CooL   (2002-12-28 10:21) [4]

Хм... Владимир, давайте еще раз с самого начала:

Есть форма, на ней editbox1, button1 и Thread1.

у Thread1 все свойства по умолчанию, в OnExcute код:


function TForm1.Thread1Execute(Sender: PThread): Integer;
var
i:integer;
begin
for i := 0 to 50000 do
begin
editbox1.Text:=int2str(i);
( Sender: PObj)
Хм... Владимир, давайте еще раз с самого начала:

Есть форма, на ней editbox1, button1 и Thread1.

у Thread1 все свойства по умолчанию, в OnExcute код:


function TForm1.Thread1Execute(Sender: PThread): Integer;
var
i:integer;
begin
for i := 0 to 50000 do
begin
editbox1.Text:=int2str(i);
editbox1.Update;
end;

end;


У кнопки в событии OnClick код:


procedure TForm1.Button1Click(Sender: PObj);
begin
thread1.Execute;
end;


При запуске программы отрабатывет OnExecute, потому что StartSuspended=False(по умолчанию), в окошке EditBox1 мелькают цифры я могу таскать в это время форму, сворачивать, разворачивать т.е. все нормально, OnExecute выполняется в отдельном потоке как и задумано. Все цикл закончился, мелькание прекратилось. Теперь я кликаю на Button, цифры снова мелькают, но
я не могу свернуть форму или переместить ее?!
Вопрос, это правильно? Если да, то зачем мне "одноразовый" Thread? Если это не правильно, то в чем проблема?




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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
1-1430
veb
2003-08-16 14:13
2003.09.01
Контейнер компонета


7-1680
Alish
2003-06-18 00:06
2003.09.01
Уважаемые мастера приведите пример реализации протокола Zmodem


6-1521
tiam
2003-06-26 14:03
2003.09.01
Net send средствами Делфи.


14-1594
Феликса
2003-08-13 21:38
2003.09.01
Как сделать redirect?


14-1647
Ketmar
2003-08-12 11:56
2003.09.01
!!!