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