Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.12;
Скачать: CL | DM;

Вниз

Проблема с потоком   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.011 c
10-1177068721
Сергей М.
2007-04-20 15:32
2012.02.12
Visual FoxPro Run-Time Library (vfpXX.dll)


15-1319661005
Юрий
2011-10-27 00:30
2012.02.12
С днем рождения ! 27 октября 2011 четверг


15-1318939960
И. Павел
2011-10-18 16:12
2012.02.12
Особенности инициализации переменных в C#


15-1319315405
Юрий
2011-10-23 00:30
2012.02.12
С днем рождения ! 23 октября 2011 воскресенье


15-1319488202
Юрий
2011-10-25 00:30
2012.02.12
С днем рождения ! 25 октября 2011 вторник