![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с потоком [D7]
de_guta © (2011-10-29 11:36:00)создаю поток при открытии формы
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 форму закрывает нормально ,не зависает.
Помогите разобраться.
Dennis I. Komarov (2011-11-01 11:35:00) [1]
> Loginov Dmitry © (01.11.11 07:32) [26]
Мой пост к автору, расслабься... :)
Loginov Dmitry (2011-11-01 07:32:00) [2]
> Dennis I. Komarov © (31.10.11 20:01) [23]
>
> Важное, на мой взгляд, уточнение: Пока Вы не понимаете что
> есть нить и как она работает в Зингере, кидайте батоны и
> таймеры на форму...
:)
Мой пост к автору не имеет совершенно никакого отношения.
Ветка же приводит к такого рода размышлениям: на чем лучше добраться до родственников из соседнего квартала, на велосипеде или самолете? Говорят, что самолет быстрее :)
Dennis I. Komarov (2011-10-31 21:21:00) [3]
> Inovet © (31.10.11 20:40) [24]
> > [23] Dennis I. Komarov © (31.10.11 20:01)
> > что есть нить и как она работает в Зингере
>
> Там две и больше.
Но у каждой своя судьба...
Inovet (2011-10-31 20:40:00) [4]> [23] Dennis I. Komarov © (31.10.11 20:01)
> что есть нить и как она работает в Зингере
Там две и больше.
Dennis I. Komarov (2011-10-31 20:01:00) [5]Важное, на мой взгляд, уточнение: Пока Вы не понимаете что есть нить и как она работает в Зингере, кидайте батоны и таймеры на форму...
Loginov Dmitry (2011-10-30 22:44:00) [6]
> Если же мы хотим приостановить поток, что-то сделать, а
> потом запустить, надо ему сначала сделать Suspend, потом
> Resume.
Важное, на мой взгляд, уточнение: Suspend следует вызывать только в контексте останавливаемого потока.
Плохиш (2011-10-30 11:10:00) [7]OnClose не выполняется если форму закрывать по крестику. Используй OnCloseQuery
de_guta (2011-10-30 10:18:00) [8]ошибка вылазиит только если процедура automode запускается из TForm2.FormActivate, если по кнопке то норм., но мне надо при открытии формы запускать
de_guta (2011-10-30 09:58:00) [9]я нашел причину, OnClose не обрабатывается когда окно открыто как ShowModal, если открывать как просто Show то при закрытии формы вылазиит exeption cannot change visible in onshow or onhide
sniknik (2011-10-30 08:34:00) [10]> СОбытие 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 06:05:00) [11]Поток не нужен? Обьясните тогда как пользователю форму закрыть, событие 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-29 19:38:00) [12]> Для этого поток не нужен.
некоторым событийную логику понять сложнее чем в поток форму засунуть, и ждать чудес... типа "оно все поймет и сделает как мне надо, а вот мне понимать как оно работает влом".
Anatoly Podgoretsky (2011-10-29 15:40:00) [13]> de_guta (29.10.2011 14:26:12) [12]
Для этого поток не нужен.
Anatoly Podgoretsky (2011-10-29 15:39:00) [14]> de_guta (29.10.2011 13:55:09) [9]
Пропадает если неверно написано
Сергей М. (2011-10-29 15:05:00) [15]
> причина его создания была в в возможности остановить в любом
> месте мою процедуру
И это ВСЕ причины для использования твоей процедуры именно в дополнительном, а не основном потоке ?
Т.е. остановит свою процедуру в осн.потоке ты не в состоянии ?
de_guta (2011-10-29 14:26:00) [16]в топку), короче понавставлял везде во всех циклах в Form2.AutoMode проверку на newthread.Terminated, шевелится все пока, но грустно все равно), я не понимаю смысл тогда потока этого. причина его создания была в в возможности остановить в любом месте мою процедуру, где изначально в ждущих действия циклах пранировалось ограничиться Application.ProcessMessages
Сергей М. (2011-10-29 14:10:00) [17]
> в мануале написано про то что надо юзать Synchronize чтоб
> небыло глюков, но после этого весь смысл использования потока
> пропадает
Вывод-то отсюда сам собой напрашивается: мануал вместе с потоками - в топку)
MBo (2011-10-29 14:07:00) [18]>но после этого весь смысл использования потока пропадает((
А в чём смысл использования потока?
de_guta (2011-10-29 13:55:00) [19]
> в курсе что vcl не потоко безопасен? т.е. это у тебя рассадник
> будущих возможных глюков
да в мануале написано про то что надо юзать Synchronize чтоб небыло глюков, но после этого весь смысл использования потока пропадает((
sniknik (2011-10-29 13:09:00) [20]> Почему будущих, когда текущих.
ну, я бы не сказал, что когда работает правильно, но не так как ожидал автор это глюк. это скорее "недоученность".