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

Вниз

Thread   Найти похожие ветки 

 
Volodya_   (2004-09-14 15:37) [0]

Почему у меня поток вызывается только 1 раз?
Вот так я его вызываю:
       testhread := Ttesthread.Create(true);
       testhread.FreeOnTerminate := true;
       testhread.Priority := tpLower;
       testhread.Resume;
А вот выполняемая процедура
procedure Ttesthread.Execute;
begin
       showmessage("test");
end;
Выполняется только 1 раз и всьо, в чем ошибка?


 
TUser ©   (2004-09-14 15:39) [1]

Поток завершится, когда будет выполнен Execute. А чтобы было много раз надо проверять флаг Terminated
procedure Ttesthread.Execute;
begin
  while not Terminated do
      showmessage("test");
end;


 
Digitman ©   (2004-09-14 15:40) [2]


> Почему у меня поток вызывается только 1 раз?


а сколько раз. по-твоему, он должен "вызываться" ? чем ты руководствуешься при утверждении обратного ?


 
begin...end ©   (2004-09-14 15:40) [3]

А почему должен больше одного раза?


 
Суслик ©   (2004-09-14 15:40) [4]


> Выполняется только 1 раз и всьо, в чем ошибка?

в том, что не прочел документацию к классу tthread и ни одной книги по tthread не прочел, в чем же еще.

набираем thread, нажимаем ф1, нажимаем example, находим 10 отличий в твоем методе execute из методе exceut из примера.


 
Volodya_   (2004-09-14 15:41) [5]

Ну вот мне нужно чтобы поток запускался каждый раз когда я жму на кнопку, как это сделать?


 
Miralex ©   (2004-09-14 15:43) [6]


> procedure Ttesthread.Execute;
> begin
>        showmessage("test");
> end;


ну он у тебя выдаст сообщение test и закроеться!
Ты попробуй его зациклить как TUser написал и пришей
testhread := Ttesthread.Create(true);
      testhread.FreeOnTerminate := true;
      testhread.Priority := tpLower;
      testhread.Resume;

на кнопку какуюто!

Сколько раз нажмешь - столько и будет у тя потоков! :-)


 
Суслик ©   (2004-09-14 15:45) [7]

если я не ошибаюсь showmessage использует vcl (т.е. это не winapi функция, как messagebox). поэтому вызов showmessage надо делать через synchronize.


 
Miralex ©   (2004-09-14 15:50) [8]


> надо делать через synchronize


а помоему ненадо! (хотя могет я и не прав!)

Почему у тя поток не может крикнуть showmessage?

synchronize надо если хочешь синхронизировать обмен данными между потоками!


 
TUser ©   (2004-09-14 15:53) [9]


> а помоему ненадо! (хотя могет я и не прав!)

Надо.


 
Volodya_   (2004-09-14 15:54) [10]

Спасибо Суслик ©   (14.09.04 15:45) [7]
Сделал synchronize, и теперь все нормально, при каждом нажатии на кнопку выскикивает мессджбокс.

Теперь такой ворос, если у меня не закончил выполнятся 1 поток и я жму на кнопку чтобы запустить следующий, что будет? Будет запущено 2 потока в системе или 1-й будет автоматически завершен?


 
Digitman ©   (2004-09-14 15:55) [11]


> Miralex ©   (14.09.04 15:50) [8]
> а помоему ненадо! (хотя могет я и не прав!)


и оч даже неправ


> Почему у тя поток не может крикнуть showmessage?


по кочану ... ShowMessage() создает экземпляр класса-наследника TWinControl, и это не потокобезопасно


> synchronize надо если хочешь синхронизировать обмен данными
> между потоками


ты слышал звон, да не знаешь где он


 
Суслик ©   (2004-09-14 15:56) [12]


>  [10] Volodya_   (14.09.04 15:54)

будет два потока


 
Volodya_   (2004-09-14 15:59) [13]

Спасибо Суслик ©!


 
Семен Сорокин ©   (2004-09-14 16:09) [14]

Суслик ©   (14.09.04 15:56) [12]
будет два потока

Для приведенной выше реализации - не будет двух потоков, ибо по закрытию ShowMessage поток заканчивается, а так как флаг FreeOnTerminate у нас в true - то и убивается...
2Volodya_
Вообще нахрена (извините) городить поток для показа ShowMessage, который к томуж через Synhronize выполняется в контексте основного потока?


 
Суслик ©   (2004-09-14 16:12) [15]


>  [14] Семен Сорокин ©   (14.09.04 16:09)

точно это сказать нельзя
может пользователь спринтер - успеет сто раз за секунду нажать на кнопку - тогда может быть и два потока, и три.

особенно с учетом приоритета потока такая ситуация кажется не совсем уж невероятной.


 
Volodya_   (2004-09-14 16:28) [16]

>Семен Сорокин ©   (14.09.04 16:09) [14]
1. Я не говорил что для showmessage буду запускать много потоков и Суслик вполне меня понял, в отличаи от вас
2. showmessage это было просто для теста или мне здесь выкладывать весь свой код?!



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
1-1095440841
Scorpion
2004-09-17 21:07
2004.10.03
Приоритеты потока


4-1092864965
Зяц
2004-08-19 01:36
2004.10.03
Как задвинуть дверцу CDROM обратно


3-1094566704
Виталий Панасенко
2004-09-07 18:18
2004.10.03
Обновление VIEW


4-1092748880
Vasya.ru
2004-08-17 17:21
2004.10.03
Программа через автозапуск не работает


6-1088974260
Квэнди
2004-07-05 00:51
2004.10.03
Копирование файлов