Форум: "Начинающим";
Текущий архив: 2012.02.12;
Скачать: [xml.tar.bz2];
ВнизПроблема с потоком Найти похожие ветки
← →
de_guta (2011-10-29 11:36) [0]создаю поток при открытии формы
NewThread:=TNewThread.Create;
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpNormal;
он сразу же запускается, так и нужно.
procedure TNewThread.Execute;
begin
Form2.AutoMode; // Тут куча всяких действий, вложенные ц иклы , задержки, ожидания
end;
далее нужно чтоб по нажатию FormKeyDown в зависимости от клавиши происходили те или иные действия, пишу:
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
vk_f4:
begin
NewThread.Terminate;
//?нужен NewThread.WaitFor;
NewThread.Resume;
end;
vk_escape:
Form2.close;
вобщем нужно при нажатии клавиши прервать выполнение всех действий в потоке и начать выполнять его занова. Когда выполняется Terminate , на экране код функции Form2.AutoMode все равно продолжает свою работу, хотя vk_escape форму закрывает нормально ,не зависает.
Помогите разобраться.
← →
Внук © (2011-10-29 11:48) [1]Во-первых, Terminate сам по себе поток не остановит. Код метода Execute (или там AutoMode) должен проверять флаг Terminated и реагировать соответствующим образом. Во-вторых, терминированный поток с помощью Resume не запустишь, если поток надо запустить именно заново (а не продолжить с прерванного места), то нужно создавать новый объект потока.
← →
de_guta (2011-10-29 11:53) [2]хм, если Terminate не останавливает поток , зачем он тогда нужен
← →
Anatoly Podgoretsky © (2011-10-29 12:37) [3]Поверь он нужен.
← →
Dimka Maslov © (2011-10-29 12:38) [4]
> хм, если Terminate не останавливает поток , зачем он тогда
> нужен
Чтобы передать потоку, что он должен штатным образом прекратить работу. Потому что при силовой остановке потока возможна утечка ресурсов. Если же мы хотим приостановить поток, что-то сделать, а потом запустить, надо ему сначала сделать Suspend, потом Resume. И не забыть про правильную синхронизацию. А то получим deadlock.
← →
sniknik © (2011-10-29 12:40) [5]> зачем он тогда нужен
подымает "флаг" по которому внутри потока программист прерывает его там где ему нужно... а не посередине транзакции например.
есть внешний терминейт который для "срубания" зависших "впавших" в бесконечный цикл... только он для НЕШТАТНОГО завершения, и после такого программу обычно перестартуют.
> procedure TNewThread.Execute;
> begin
> Form2.AutoMode; // Тут куча всяких действий, вложенные ц иклы , задержки, ожидания
> end;
в курсе что vcl не потоко безопасен? т.е. это у тебя рассадник будущих возможных глюков. (отсутствие реакции на Terminate, это "только первая ласточка" ;)
← →
Anatoly Podgoretsky © (2011-10-29 12:53) [6]Почему будущих, когда текущих.
← →
Сергей М. © (2011-10-29 12:57) [7]
NewThread.Terminate;
//?нужен NewThread.WaitFor; // не нужен при FreeTerminate = True
NewThread.Resume; // команда потенциальному трупу - "проснись и доделай свои дела" ?)
← →
sniknik © (2011-10-29 13:09) [8]> Почему будущих, когда текущих.
ну, я бы не сказал, что когда работает правильно, но не так как ожидал автор это глюк. это скорее "недоученность".
← →
de_guta (2011-10-29 13:55) [9]
> в курсе что vcl не потоко безопасен? т.е. это у тебя рассадник
> будущих возможных глюков
да в мануале написано про то что надо юзать Synchronize чтоб небыло глюков, но после этого весь смысл использования потока пропадает((
← →
MBo © (2011-10-29 14:07) [10]>но после этого весь смысл использования потока пропадает((
А в чём смысл использования потока?
← →
Сергей М. © (2011-10-29 14:10) [11]
> в мануале написано про то что надо юзать Synchronize чтоб
> небыло глюков, но после этого весь смысл использования потока
> пропадает
Вывод-то отсюда сам собой напрашивается: мануал вместе с потоками - в топку)
← →
de_guta (2011-10-29 14:26) [12]в топку), короче понавставлял везде во всех циклах в Form2.AutoMode проверку на newthread.Terminated, шевелится все пока, но грустно все равно), я не понимаю смысл тогда потока этого. причина его создания была в в возможности остановить в любом месте мою процедуру, где изначально в ждущих действия циклах пранировалось ограничиться Application.ProcessMessages
← →
Сергей М. © (2011-10-29 15:05) [13]
> причина его создания была в в возможности остановить в любом
> месте мою процедуру
И это ВСЕ причины для использования твоей процедуры именно в дополнительном, а не основном потоке ?
Т.е. остановит свою процедуру в осн.потоке ты не в состоянии ?
← →
Anatoly Podgoretsky © (2011-10-29 15:39) [14]> de_guta (29.10.2011 13:55:09) [9]
Пропадает если неверно написано
← →
Anatoly Podgoretsky © (2011-10-29 15:40) [15]> de_guta (29.10.2011 14:26:12) [12]
Для этого поток не нужен.
← →
sniknik © (2011-10-29 19:38) [16]> Для этого поток не нужен.
некоторым событийную логику понять сложнее чем в поток форму засунуть, и ждать чудес... типа "оно все поймет и сделает как мне надо, а вот мне понимать как оно работает влом".
← →
de_guta (2011-10-30 06:05) [17]Поток не нужен? Обьясните тогда как пользователю форму закрыть, событие OnClose формы не обрабатывается:
Procedure TForm2.AutoMode;
begin
if WaitP then
begin
//do smth
end;
Function TForm2.WaitP:boolean;
begin
repeat
GetP(1,1,0); // тут ничего виснуть не может
GetP(2,1,64);
GetP(3,1,32);
if (P[1,1]>Pmin) or(P[2,1]>Pmin) or (P[3,1]>Pmin) then
begin
label10.Visible:=false;
label11.Visible:=false;
label12.Visible:=false;
result:=true;
exit;
end
else
result:=false;
Application.ProcessMessages; // это постоянно обрабатывается в отладчике смотрел
until {newthread.Terminated;} (is_close) or (application.Terminated);
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{NewThread.Terminate;}
is_close:=true;
end;
СОбытие FormClose не обрабатывается несмотря на Application.ProcessMessages;
OnKeyDown формы обрабатывается нормально.
← →
sniknik © (2011-10-30 08:34) [18]> СОбытие FormClose не обрабатывается несмотря на Application.ProcessMessages;
ну, судя по тому как ты пишешь... неудивительно.
сделай проверку, исключи влияние "лишнего" кода, т.е. того который не относится к проблеме на которую "валишь вину", глядишь и нужно будет искать другую...
в новом проекте, на новой "читсой" форме - кладешьprocedure TForm1.WaitP;
begin
repeat
Sleep(100); //имитация "бурной деятельности"
Application.ProcessMessages; // это постоянно обрабатывается в отладчике смотрел
until is_close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
is_close:= false;
WaitP;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
is_close:= true;
end;
и видишь, что все прекрасно закрывается. а проблема, несмотря на приведенный код, все еще спокойно "живет" в 17й строке.
← →
de_guta (2011-10-30 09:58) [19]я нашел причину, OnClose не обрабатывается когда окно открыто как ShowModal, если открывать как просто Show то при закрытии формы вылазиит exeption cannot change visible in onshow or onhide
← →
de_guta (2011-10-30 10:18) [20]ошибка вылазиит только если процедура automode запускается из TForm2.FormActivate, если по кнопке то норм., но мне надо при открытии формы запускать
← →
Плохиш © (2011-10-30 11:10) [21]OnClose не выполняется если форму закрывать по крестику. Используй OnCloseQuery
← →
Loginov Dmitry © (2011-10-30 22:44) [22]
> Если же мы хотим приостановить поток, что-то сделать, а
> потом запустить, надо ему сначала сделать Suspend, потом
> Resume.
Важное, на мой взгляд, уточнение: Suspend следует вызывать только в контексте останавливаемого потока.
← →
Dennis I. Komarov © (2011-10-31 20:01) [23]Важное, на мой взгляд, уточнение: Пока Вы не понимаете что есть нить и как она работает в Зингере, кидайте батоны и таймеры на форму...
← →
Inovet © (2011-10-31 20:40) [24]> [23] Dennis I. Komarov © (31.10.11 20:01)
> что есть нить и как она работает в Зингере
Там две и больше.
← →
Dennis I. Komarov © (2011-10-31 21:21) [25]
> Inovet © (31.10.11 20:40) [24]
> > [23] Dennis I. Komarov © (31.10.11 20:01)
> > что есть нить и как она работает в Зингере
>
> Там две и больше.
Но у каждой своя судьба...
← →
Loginov Dmitry © (2011-11-01 07:32) [26]
> Dennis I. Komarov © (31.10.11 20:01) [23]
>
> Важное, на мой взгляд, уточнение: Пока Вы не понимаете что
> есть нить и как она работает в Зингере, кидайте батоны и
> таймеры на форму...
:)
Мой пост к автору не имеет совершенно никакого отношения.
Ветка же приводит к такого рода размышлениям: на чем лучше добраться до родственников из соседнего квартала, на велосипеде или самолете? Говорят, что самолет быстрее :)
← →
Dennis I. Komarov © (2011-11-01 11:35) [27]
> Loginov Dmitry © (01.11.11 07:32) [26]
Мой пост к автору, расслабься... :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.02.12;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c