Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с потоком [D7]


Страницы:   1 2

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]

> Почему будущих, когда текущих.
ну, я бы не сказал, что когда работает правильно, но не так как ожидал автор это глюк. это скорее "недоученность".


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо