![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread, ну не пойму я!
CooL © (2002-12-23 16:04:00)
Прошу прощения возможно за идиотский вопрос, но все таки кто нибудь подскажет как грамотно использовать TKolThread? Обьясняю, в качестве примера: создаю форму(само собой Kol-project), на форме KolEditBox и кнопку KolButton, кидаю на форму KolThread свойства которого по умолчанию. В событии OnExecute простой счетчик(for .. to .. do) с выводом переменной цикла в KolEditBox, в событии кнопки OnClik что я должен написать, что бы этот самый OnExecute выполнялся при каждом нажатии на кнопку?! И что бы это было действительно Thread?
Ну не работает это так как должно, по моим понятиям!
Очень может быть, что я чего то не понимаю, pls раз"ясните.
CooL (2002-12-28 10:21:00) [1]Хм... Владимир, давайте еще раз с самого начала:
Есть форма, на ней 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? Если это не правильно, то в чем проблема?
Vladimir Kladov (2002-12-27 10:28:00) [2]
Resume. Точно так же, как и в VCL. Если в VCL вызывать Execute, то его код будет выполняться в том потоке, из которого его вызвали. Так что и в VCL надо использовать Resume. Не верите? Перечитайте справку по VCL.TThread.
CooL (2002-12-26 12:41:00) [3]
Владимир, все понятно, но вопрос не в том, что написать в OnExecute, а как выполнить это несколько раз? Возможно я не совсем правильно ставлю вопрос, но VCL-Thread я могу запускать хоть 10 раз подряд и всегда это Thread, а вот KolThread почему-то после первой отработки в дальнейшем перестает быть таковым.
Vladimir Kladov (2002-12-26 10:45:00) [4]
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х, и ресурсов немного, то при завершении
программы это тоже несущественно.