Форум: "Основная";
Текущий архив: 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.051 c