Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,149
Записей в блоге: 3

Sleep в потоке

22.10.2019, 01:54. Показов 5979. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго!
В небольшом приложении, по мимо основной формы запускается поток.

C++
1
 Thr *Thre = new Thr (false);
В сам потоке, в паблике задаю bool как лакмус для завершения потока

C++
1
2
3
4
5
6
7
8
9
class Thr : public TThread
{
private:
protected:
    void __fastcall Execute();
public:
bool stops;           //Параметр отключения потока  (false работает, true отключается)
    __fastcall Thr(bool CreateSuspended);
};
В теле потока прописываю бесконечный цикл

C++
1
2
3
4
5
 while(!stops)
 {
     
 }
 Terminate();
Проблема что поток (даже с пустым функционалом обработки) из за этого цикла грузит проц. На сколько правильно в while вставлять Sleep? Чуйка что так не делается =))
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.10.2019, 01:54
Ответы с готовыми решениями:

Аналог Sleep
Доброго дня...Вопрос уже наверно заезженный вдоль и поперек , но всё же... Может кто нашел для себя аналог Sleep, но не используя...

Использование sleep
Builder 6.0 Создаю .cpp файл, sleep в нем не работает. Выдает ошибку "нет прототипа". Создаю .c файл, sleep в нем работает. В чем...

Альтернатива sleep() из С++11
В языке Си есть функция Sleep() из windows.h, но она сторонняя и платформо-зависимая Как можно решить ту же задачу, используя стандарт...

16
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
22.10.2019, 09:01
Dinkin, в зависимости от задачи и необходимой скорости реакции потока:

можно в начале цикла вставить на постоянку Sleep(0) (поток будет отдавать неизрасходованное время слайса, но загрузка всё равно может остаться) или Sleep(1+) (загрузка резко упадёт)

либо отслеживать рабочую активность и выполнять Sleep только когда нет никакой полезной работы в потоке.

Может, у кого ещё какие способы
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.10.2019, 10:37
Цитата Сообщение от Dinkin Посмотреть сообщение
В теле потока прописываю бесконечный цикл
А ты сделай stops не булевской переменной, а событием CreateEvent (не знаю, как там в билдере).
И жди не в бесконечном цикле, в цикле, который ожидает возникновения одного из событий - WaitForMultipleObjects

Добавлено через 33 секунды
И не надо вызывать Terminate() в функции потока, просто делай return
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,149
Записей в блоге: 3
23.10.2019, 01:13  [ТС]
Попробую оба варианта.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И не надо вызывать Terminate() в функции потока, просто делай return
Ну делал как учили в университете =)

Если я из главной формы буду просто делать по кнопке, такой функционал :
C++
1
Thre->stops = true;
Без синхронизации, это работает, но в теории должно отзываться в независимости потока, верно?
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
23.10.2019, 02:21
Цитата Сообщение от Dinkin Посмотреть сообщение
Thre->stops = true;
объяви в классе потока переменную stops так:
C++
1
std::atomic<bool> stops{false};
тогда можно будет из любого потока спокойно её устанавливать и проверять
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,149
Записей в блоге: 3
23.10.2019, 03:12  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
std::atomic<bool> stops{false};
у меня в std нет атомарок, там надо еще что то подключать?
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
23.10.2019, 07:37
Dinkin,
#include <atomic>

если имеется
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.10.2019, 10:06
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Цитата Сообщение от Алексей1153 Посмотреть сообщение
объяви в классе потока переменную stops так:
C++Выделить код
1
std::atomic<bool> stops{false};
Цитата Сообщение от Dinkin Посмотреть сообщение
у меня в std нет атомарок, там надо еще что то подключать?
Здесь atomic совершенно не нужен, достаточно объявить этот stops как volatile, чтоб компилятор его не закэшировал
C++
1
volatile bool stops;           //Параметр отключения потока  (false работает, true отключается)
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.10.2019, 12:07
Есть же Terminated свойство, чего мудрить?

C++
1
2
3
4
while(!Terminated)
{
     
}

C++
1
thread->Terminate();
Касательно Sleep() - не совсем правильно хотя я так всегда раньше делал.(А сейчас использую C++Qt где в потоке уже сидит EventLoop)

Правильнее завести очередь сообщений и объект таймер.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,149
Записей в блоге: 3
14.11.2019, 12:13  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
thread->Terminate();
Есть, но Но теоретически это может не сработать (сегодня протестирую).

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
volatile bool stops;
Хех, впервые с таким сталкиваюсь....Поток останавливается, но действительно ли это будет потоко безопастно (так же сегодня протестирую).
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.11.2019, 15:25
Цитата Сообщение от Dinkin Посмотреть сообщение
Есть, но Но теоретически это может не сработать (сегодня протестирую).
Где Вы это теорию берете? На дне бутылки?

Добавлено через 1 минуту
Атомик как раз нужен если дело про С++ и гарантии, но там же исходный код на Delphi и наверное разработчики уверены что компилятор нормально отработает.


0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.11.2019, 15:28
Цитата Сообщение от Avazart Посмотреть сообщение
Атомик как раз нужен
Зачем, в данном случае?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.11.2019, 15:41
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Зачем, в данном случае?
Как зачем? Для гарантий атомарности ведь обращение к одной переменной из разных потоков.

Но как я сказал в данном конкретном случае логично положится на разработчиков VCL.

Добавлено через 9 минут
Хотя как я помню, когда я смотрел в исходниках Delphi так этот мембер никак вроде не был помечен.

А вот в исходниках С++Qt член класса играющий ровно такую же роль определен как атомик:
C++ (Qt)
1
std::atomic<bool> interruptionRequested;
https://code.woboq.org/qt5/qtb... nRequested
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.11.2019, 15:48
Цитата Сообщение от Avazart Посмотреть сообщение
Как зачем? Для гарантий атомарности ведь обращение к одной переменной из разных потоков.
А так не гарантируется?
Атомарность нужна, когда ты выполняешь какие-то арифметические операции с этой переменной, либо проверяешь знначение и в зависимости от результата присваиваешь ей новое значение - т.е. когда тебе нужно атомарно произвести несколько операций с переменной.
Здесь же в одном потоке только присваивается, безусловно, в другом - проверяется. Синхронизировать ничего не нужно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.11.2019, 15:51
Для bool и конкретно этого случая возможно и ничего страшного и не будет, но в общем случае - нужно.
Хотя опять же стоит смотреть "во внутренности" в исходники.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,149
Записей в блоге: 3
14.11.2019, 17:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Где Вы это теорию берете? На дне бутылки?
Нет, с ОФФ документации. документации. Тут говрится, что гарантировать что поток завершится, если использовать в связке с ProcessMessages (что меня не устраивает).

И кстати, на этом же ресурсе, оф примеры, и некоторый они с использованием Sleep.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.11.2019, 18:44
Цитата Сообщение от Dinkin Посмотреть сообщение
Нет, с ОФФ документации. документации. Тут говрится, что гарантировать что поток завершится, если использовать в связке с ProcessMessages (что меня не устраивает).
И кстати, на этом же ресурсе, оф примеры, и некоторый они с использованием Sleep.
А внимательно посмотреть? Или ну его лучше по еще одной накатить?
Речь идет про TApplication.Terminated а не TThread.Terminated


Я смотрю исходники в XE3:
Pascal
1
2
3
4
5
6
7
8
  TThread = class
  private
    FTerminated: Boolean;
  protected
    property Terminated: Boolean read FTerminated;
 
  public
    procedure Terminate;

Pascal
1
2
3
4
5
6
7
procedure TThread.Terminate;
begin
  if FExternalThread then
    raise EThread.CreateRes(@SThreadExternalTerminate);
  FTerminated := True;
  TerminatedSet;
end;
Т.е. по сути тут вообще ничего не делается тупо выставляется булевый флаг, при чем без всякой синхронизации и каких либо мер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2019, 18:44
Помогаю со студенческими работами здесь

Работа с формой в Sleep
Здравствуйте! Подскажи, у меня в программе есть пара Sleepов, 1-5 секунд. Но во время слипа, форма как бы подвисает и не дает нажимать ни...

Альтернативная замена Sleep()
Пишу программку управления светодиодом, нужно чтобы он загорался в определенное время на задаваемое количество секунд. Пробовал...

Работа оператора Sleep
Всем здравствуйте. Пытаюсь организовать задержку без использования таймера. Натолкнулся на следующее: void __fastcall...

Функция Sleep() C++ Builder
Дело в том что функция Sleep() не правильно работает. Мне надо чтобы при нажатии на Image, картинка двигалась влево, а потом обратно. При...

IdTCPServer1 и Sleep(2000) ошибка
Здраствуйте, собственно ситуация абсурдная на форме IdTCPServer1 и Button1 в IdTCPServer1 ничего не изменено, в кнопке написал : ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru