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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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


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

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


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