powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как приостановить работу потока? Скажите, прошу!
17 сообщений из 17, страница 1 из 1
Как приостановить работу потока? Скажите, прошу!
    #39966660
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему в Delphi XE методы "suspend" и "resume" в TThread помечены как "deprecated"? Как приостановить работу потока и потом снова его запустить? Как?
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966662
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sleep(), WaitForSingleObject(), WaitForMultipleObjects() - выбирай на вкус.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966663
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec,

То что они deprecated не значит что они не работают.

Другое дело что пользоваться ими надо с осторожностью, понимая что при resume что-то (например всякое I/O) может пойти не так.

А так, рекомендуется в цикле потока проверять на некий boolean с паузой вручную.

Ну что-то типа: while DoSleep do sleep(1);
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966665
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatрекомендуется

Дайте ссылку на место где это рекомендуется. Чтобы потом можно было всем тыкать ею в лицо:
"там был? так вот в этом - самая большая ошибка, забудь всё, чему там научили".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966666
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Это только один из вариантов заменяющих suspend/resume. Самый простой для понимания.

Спорить с тобой за какую-то фигню у меня интереса нет.
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966669
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatСамый простой для понимания.

И совершенно неприемлемый в реальных программах. Думать же надо, когда советуешь на
форумах говнокод. Топикстартеры на него слетаются миллионами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966671
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Реальный код много места займет.

А так - умному достаточно что бы идею понять.
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966676
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
А так, рекомендуется

Dimitry Sibiryakov
Дайте ссылку на место где это рекомендуется. Чтобы потом можно было всем тыкать ею в лицо:

Вы оба заняли крайние позиции. Истина где-то в середине.
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966699
VirtaOtec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, остановить поток так, чтобы не срабатывал его метод execute до того, как опять возобновишь работу, не получится? Тот же sleep надо вызывать на какое-то время в цикле до тех пор, пока поток не будет активирован - значит, на малое время. То есть, поток все равно будет работать, хоть и не станет выполнять никаких действий.
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966700
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

rgreatСамый простой для понимания.

И совершенно неприемлемый в реальных программах. Думать же надо, когда советуешь на
форумах говнокод. Топикстартеры на него слетаются миллионами.


Как показывает практика, начинающие вызывают из потока synchronize и не парятся. Так что организация паузы с помощью sleep это самое безобидное :)
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966719
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtecТо есть, остановить поток так, чтобы не срабатывал его метод execute до того, как опять
возобновишь работу, не получится?

Обычно этого и не требуется. Потоки запускаются чтобы сделали какую-то работу. Как только
они её сделали - они завершаются.

Особый случай - рабочие потоки. Но эти естественным путём ждут появления задания в очереди
и опять же их приостанавливать не требуется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966721
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
особых случаев вообще много, всяких и разных. Но особые на и особые, что новичок с ними не столкнется от слова "вообще".
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966727
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rособые на и особые, что новичок с ними не столкнется

Новичок на то и новичок, чтобы считать себя и свои случаи исключительно особенными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966734
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
То есть, остановить поток так, чтобы не срабатывал его метод execute до того, как опять возобновишь работу, не получится?


Очень долго смотрел на эту фразу, никак не могу понять, что за проблему Вы решаете?

Внешние остановки/запуски потока нужны, по моему опыту, только в отладочных целях, либо для модификации поведения "чужих" потоков, что похоже на отладку.
В нормальной ситуации, поток сам входит в ожидающее состояние.

Вы знакомы с объектом/понятием TEvent?
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966740
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
Почему в Delphi XE методы "suspend" и "resume" в TThread помечены как "deprecated"? Как приостановить работу потока и потом снова его запустить? Как?

В хелпе по этим методам достаточно ясно написано, почему их решили задепрекейтить.

Поток, остановленный извне, останавливается в совершенно произвольной точке, например внутри системного вызова, работа которого зависит от глобального состояния системы. И если за время простоя потока это состояние изменится, вызов вернет неактуальную или некорректную информацию.

Короче, принудительное торможение потоков извне -- это источник неуловимых глюков и так делать нельзя. Особенно новичкам, у которых с потоками и так очень непростые взаимоотношения.
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966745
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
То есть, остановить поток так, чтобы не срабатывал его метод execute до того, как опять возобновишь работу, не получится? Тот же sleep надо вызывать на какое-то время в цикле до тех пор, пока поток не будет активирован - значит, на малое время. То есть, поток все равно будет работать, хоть и не станет выполнять никаких действий.
Вот Dimitry Sibiryakov написал про WaitForSingleObject(), WaitForMultipleObjects(), а x1ca4064 - про класс TEvent в Дельфи, "обертку" для этих функций.
Если использовать класс, то ставишь перед кодом в потоке, который надо выполнить по какому-то условию:
Код: pascal
1.
Event.WaitFor(...);


Когда в основном потоке что-то случилось и нужно запустить поток, вызываешь
Код: pascal
1.
Event.SetEvent;


Чтобы сбросить событие:
Код: pascal
1.
Event.ResetEvent;
...
Рейтинг: 0 / 0
Как приостановить работу потока? Скажите, прошу!
    #39966909
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VirtaOtec
То есть, остановить поток так, чтобы не срабатывал его метод execute до того, как опять возобновишь работу, не получится? Тот же sleep надо вызывать на какое-то время в цикле до тех пор, пока поток не будет активирован - значит, на малое время. То есть, поток все равно будет работать, хоть и не станет выполнять никаких действий.

Если цель в том, чтобы потоку дать задачу и он сам остановился при её завершении до следующего задания, то у меня есть решение.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как приостановить работу потока? Скажите, прошу!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]