Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
14-1567
iusupp
2003-08-06 13:08
2003.09.01
Кто поддержит тему...? Написать курсы для начинающих по Дельфи...


1-1397
SergP
2003-08-15 21:12
2003.09.01
Как можно запретить вызов even ta пока не отработал другой event


3-1327
sickalex
2003-08-07 16:56
2003.09.01
BDE


14-1554
Карелин Артем
2003-08-11 11:40
2003.09.01
Методики оценки неоходимого количества выпивки и закуски.


14-1636
Marconi
2003-08-12 07:54
2003.09.01
Цена делфи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский