![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread [D6, WinXP]
Volodya_ © (2004-09-14 15:37:00)Почему у меня поток вызывается только 1 раз?
Вот так я его вызываю:
testhread := Ttesthread.Create(true);
testhread.FreeOnTerminate := true;
testhread.Priority := tpLower;
testhread.Resume;
А вот выполняемая процедура
procedure Ttesthread.Execute;
begin
showmessage('test');
end;
Выполняется только 1 раз и всьо, в чем ошибка?
Volodya_ (2004-09-14 16:28:00) [1]>Семен Сорокин © (14.09.04 16:09) [14]
1. Я не говорил что для showmessage буду запускать много потоков и Суслик вполне меня понял, в отличаи от вас
2. showmessage это было просто для теста или мне здесь выкладывать весь свой код?!
Суслик (2004-09-14 16:12:00) [2]
> [14] Семен Сорокин © (14.09.04 16:09)
точно это сказать нельзя
может пользователь спринтер - успеет сто раз за секунду нажать на кнопку - тогда может быть и два потока, и три.
особенно с учетом приоритета потока такая ситуация кажется не совсем уж невероятной.
Семен Сорокин (2004-09-14 16:09:00) [3]Суслик © (14.09.04 15:56) [12]
будет два потока
Для приведенной выше реализации - не будет двух потоков, ибо по закрытию ShowMessage поток заканчивается, а так как флаг FreeOnTerminate у нас в true - то и убивается...
2Volodya_
Вообще нахрена (извините) городить поток для показа ShowMessage, который к томуж через Synhronize выполняется в контексте основного потока?
Volodya_ (2004-09-14 15:59:00) [4]Спасибо Суслик ©!
Суслик (2004-09-14 15:56:00) [5]
> [10] Volodya_ (14.09.04 15:54)
будет два потока
Digitman (2004-09-14 15:55:00) [6]
> Miralex © (14.09.04 15:50) [8]
> а помоему ненадо! (хотя могет я и не прав!)
и оч даже неправ
> Почему у тя поток не может крикнуть showmessage?
по кочану ... ShowMessage() создает экземпляр класса-наследника TWinControl, и это не потокобезопасно
> synchronize надо если хочешь синхронизировать обмен данными
> между потоками
ты слышал звон, да не знаешь где он
Volodya_ (2004-09-14 15:54:00) [7]Спасибо Суслик © (14.09.04 15:45) [7]
Сделал synchronize, и теперь все нормально, при каждом нажатии на кнопку выскикивает мессджбокс.
Теперь такой ворос, если у меня не закончил выполнятся 1 поток и я жму на кнопку чтобы запустить следующий, что будет? Будет запущено 2 потока в системе или 1-й будет автоматически завершен?
TUser (2004-09-14 15:53:00) [8]
> а помоему ненадо! (хотя могет я и не прав!)
Надо.
Miralex (2004-09-14 15:50:00) [9]
> надо делать через synchronize
а помоему ненадо! (хотя могет я и не прав!)
Почему у тя поток не может крикнуть showmessage?
synchronize надо если хочешь синхронизировать обмен данными между потоками!
Суслик (2004-09-14 15:45:00) [10]если я не ошибаюсь showmessage использует vcl (т.е. это не winapi функция, как messagebox). поэтому вызов showmessage надо делать через synchronize.
Miralex (2004-09-14 15:43:00) [11]
> procedure Ttesthread.Execute;
> begin
> showmessage('test');
> end;
ну он у тебя выдаст сообщение test и закроеться!
Ты попробуй его зациклить как TUser написал и пришей
testhread := Ttesthread.Create(true);
testhread.FreeOnTerminate := true;
testhread.Priority := tpLower;
testhread.Resume;
на кнопку какуюто!
Сколько раз нажмешь - столько и будет у тя потоков! :-)
Volodya_ (2004-09-14 15:41:00) [12]Ну вот мне нужно чтобы поток запускался каждый раз когда я жму на кнопку, как это сделать?
Digitman (2004-09-14 15:40:00) [13]
> Почему у меня поток вызывается только 1 раз?
а сколько раз. по-твоему, он должен "вызываться" ? чем ты руководствуешься при утверждении обратного ?
begin...end (2004-09-14 15:40:00) [14]А почему должен больше одного раза?
Суслик (2004-09-14 15:40:00) [15]
> Выполняется только 1 раз и всьо, в чем ошибка?
в том, что не прочел документацию к классу tthread и ни одной книги по tthread не прочел, в чем же еще.
набираем thread, нажимаем ф1, нажимаем example, находим 10 отличий в твоем методе execute из методе exceut из примера.
TUser (2004-09-14 15:39:00) [16]Поток завершится, когда будет выполнен Execute. А чтобы было много раз надо проверять флаг Terminated
procedure Ttesthread.Execute;
begin
while not Terminated do
showmessage('test');
end;