Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.034 c
1-1095448396
4МО
2004-09-17 23:13
2004.10.03
TaskBar


8-1089442347
Andrew
2004-07-10 10:52
2004.10.03
Как нарисовать на канвасе Bitmap вращающуюся спираль?


4-1092757634
Александр1
2004-08-17 19:47
2004.10.03
Работа с дисками!


1-1095440841
Scorpion
2004-09-17 21:07
2004.10.03
Приоритеты потока


1-1095214653
Артем К.
2004-09-15 06:17
2004.10.03
Ускорение запуска программы?





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