Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1320150226
начинающий_
2011-11-01 15:23
2012.02.12
конструктор / деструктор


2-1320656448
Terrmit
2011-11-07 12:00
2012.02.12
Программное открытие окна PopupEdit


15-1319444691
Фокс Йожин
2011-10-24 12:24
2012.02.12
Странные тормоза при загрузке Windows XP


15-1319522934
И. Павел
2011-10-25 10:08
2012.02.12
Пропала палитра компонентов


2-1320472669
defen2204
2011-11-05 08:57
2012.02.12
представление файла в байтовом виде





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