C++ Отличие std::this_thread::sleep_for(std::chrono::microseconds(5)) от Sleep(5)

Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,442
Реакции[?]
671
Поинты[?]
30K
Нашел в сурсах у чела, есть ли вообще разница ?
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
С помощью первого ты делаешь слип только для отдельного потока (созданного с помощью <thread>), а с помощью второго - слип на всю программу.
Могу ошибаться, но по-логике - это так.
 
Последнее редактирование:
t.me/maj0rblog
Дизайнер
Статус
Оффлайн
Регистрация
6 Окт 2018
Сообщения
975
Реакции[?]
619
Поинты[?]
12K
С помощью первого ты делаешь слип только для отдельного потока (созданного с помощью std::this_tread), а с помощью второго - всю программу.
Могу ошибаться, но по-логике - это так.
К примеру добавлю что при использовании слип длл файл замораживает всё свои потоки, как и потоки игры/программы в которой это внедрено
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,996
Реакции[?]
1,275
Поинты[?]
5K
Первым ты замораживаешь свой поток и не важно как он создан, вторым все потоки
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,442
Реакции[?]
671
Поинты[?]
30K
С помощью первого ты делаешь слип только для отдельного потока (созданного с помощью <thread>), а с помощью второго - слип на всю программу.
Могу ошибаться, но по-логике - это так.
Я в плане, вот есть функция, в ней есть Sleep(5), и эта функция работает в потоке, она разве по деффолту не останавливает поток, в котором этот Sleep и используетсся ?
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Я в плане, вот есть функция, в ней есть Sleep(5), и эта функция работает в потоке, она разве по деффолту не останавливает поток, в котором этот Sleep и используетсся ?
Ну, как уже написали два раза до меня - Sleep() останавливает все потоки, в т.ч. тот, в котором он вызывается.
 
Продавец
Статус
Оффлайн
Регистрация
28 Окт 2019
Сообщения
1,153
Реакции[?]
302
Поинты[?]
3K
На самом деле и слип и слип фор останавливают только тот поток в котором вызываются. Отличие заключается в том,что слип фор определен стандартам плюсов, а обычный слип только в винапи. Следовательно слееп фор может работать не толко на виндовс системах
 
t.me/maj0rblog
Дизайнер
Статус
Оффлайн
Регистрация
6 Окт 2018
Сообщения
975
Реакции[?]
619
Поинты[?]
12K
На самом деле и слип и слип фор останавливают только тот поток в котором вызываются. Отличие заключается в том,что слип фор определен стандартам плюсов, а обычный слип только в винапи. Следовательно слееп фор может работать не толко на виндовс системах
По моему ты что-то не договариваешь, когда я использовал слип в своём чите (Который работал в мульти потоке) у меня ставились на паузу как все потоки чита так и все потоки игры
 
Продавец
Статус
Оффлайн
Регистрация
28 Окт 2019
Сообщения
1,153
Реакции[?]
302
Поинты[?]
3K
По моему ты что-то не договариваешь, когда я использовал слип в своём чите (Который работал в мульти потоке) у меня ставились на паузу как все потоки чита так и все потоки игры
Возможно ты использовал слип в функции, которая вызывалась в хуке или до createthread. В таком случае это будет тем же самым,что вызвать слип в главном потоке игры
 
t.me/maj0rblog
Дизайнер
Статус
Оффлайн
Регистрация
6 Окт 2018
Сообщения
975
Реакции[?]
619
Поинты[?]
12K
Возможно ты использовал слип в функции, которая вызывалась в хуке или до createthread. В таком случае это будет тем же самым,что вызвать слип в главном потоке игры
Вполне возможно, спасибо за более понятное объяснение
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
C++:
#include <thread>
#include <chrono>

int main(int argc, char* argv[])
{
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
    return 0;
}
Компилируется в (псевдокод):

C++:
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 perf_frequency; // kr08_8
  __int64 v4; // kr10_8
  __int64 v5; // kr18_8
  __int64 v6; // rax
  unsigned int v7; // esi
  __int64 v8; // rax
  int v9; // edi
  unsigned __int64 v10; // rcx
  __int64 perf_counter; // [esp-14h] [ebp-5Ch]
  __int64 v13; // [esp-14h] [ebp-5Ch]
  unsigned int v14; // [esp+10h] [ebp-38h]
  __int64 v15; // [esp+18h] [ebp-30h]
  xtime v16; // [esp+30h] [ebp-18h] BYREF

  perf_frequency = __Query_perf_frequency();
  perf_counter = __Query_perf_counter();
  v4 = 1000000000 * (perf_counter / perf_frequency) + 1000000000 * (perf_counter % perf_frequency) / perf_frequency;
  if ( v4 == 0x7FFFFFFFFF67697Fi64 || HIDWORD(v4) == 0x7FFFFFFF && (unsigned int)v4 >= 0xFF67697F )
    v15 = 0x7FFFFFFFFFFFFFFFi64;
  else
    v15 = v4 + 10000000;
  while ( 1 )
  {
    v5 = __Query_perf_frequency();
    v13 = __Query_perf_counter();
    v6 = 1000000000i64 * (unsigned int)(v13 / v5);
    v14 = v6 + 1000000000 * (v13 % v5) / v5;
    v7 = (__PAIR64__(HIDWORD(v6) + 1000000000 * ((unsigned __int64)(v13 / v5) >> 32), v6) + 1000000000 * (v13 % v5) / v5) >> 32;
    if ( v15 == __PAIR64__(HIDWORD(v6) + 1000000000 * ((unsigned __int64)(v13 / v5) >> 32), v6)
              + 1000000000 * (v13 % v5) / v5
      || v15 < __SPAIR64__(v7, v14) )
    {
      break;
    }
    v8 = 100 * __Xtime_get_ticks();
    v10 = v15 - __PAIR64__(v7, v14);
    v9 = v15 - v14;
    if ( (double)(__int64)(v15 - __PAIR64__(v7, v14)) > 8.64e14 )
    {
      v9 = -1391067136;
      HIDWORD(v10) = 201165;
    }
    v16.sec = (__int64)(__PAIR64__(HIDWORD(v10), v9) + v8) / 1000000000;
    v16.nsec = (__int64)(__PAIR64__(HIDWORD(v10), v9) + v8) % 1000000000;
    __Thrd_sleep(&v16);
  }
  return 0;
}
_Thrd_sleep из msvcp140.dll:

C++:
void __cdecl Thrd_sleep(const xtime *a1)
{
  int v2; // eax
  xtime v3; // [rsp+20h] [rbp-28h] BYREF

  xtime_get(&v3, 1);
  do
  {
    do
    {
      v2 = Xtime_diff_to_millis2(a1, &v3);
      Sleep(v2);
      xtime_get(&v3, 1);
    }
    while ( v3.sec < a1->sec );
  }
  while ( v3.sec == a1->sec && v3.nsec < a1->nsec );
}
Т.е. как и сказано выше это одно и то-же, просто std::this_thread::sleep_for(std::chrono::milliseconds(ms)) просто будет работать на разных ОС.
 
Сверху Снизу