c ++ - Sleep () vs \_sleep () funktioner

Indlæg af Hanne Mølgaard Plasc

Problem



I øjeblikket arbejder jeg på et gammelt projekt udviklet (i C og C ++) til Windows med Visual Studio 2010 eller mindre. Vi vil gerne opdatere den til nyere version som Visual Studio 2015 eller 2017.


Jeg har fundet ud af, at funktionen \_sleep () ikke længere understøttes som Microsoft, og i stedet skal jeg bruge funktionen Sleep (). [14] [15]


Jeg fandt ikke den tilsvarende dokumentation for den gamle \_sleep () -funktion, og jeg spekulerer på, om begge funktioner opfører sig nøjagtigt identiske? Dette MSDN-indlæg gør mig i tvivl om, hvorvidt de eneste forskelle ligger i typerne af argumentet? [16] [17]


På forhånd tak for dine svar.

Bedste reference


Som RbMm nævnte, \_sleep var blevet implementeret som en meget tynd wrapper omkring Sleep: [18]


void \_\_cdecl \_sleep(unsigned long dwDuration)
{

    if (dwDuration == 0) {
        dwDuration++;
    }
    Sleep(dwDuration);

}


For at bekræfte kan vi teste det. Heldigvis er det nemt at teste:


#include <iostream>
#include <chrono>
#include <windows.h>
#include <stdlib.h>

using namespace std::chrono\_literals;

int main() {
    auto tm1 = std::chrono::system\_clock::now();
    \_sleep(250);
    auto tm2 = std::chrono::system\_clock::now();
    Sleep(250);
    auto tm3 = std::chrono::system\_clock::now();
    std::cout << "\_sleep took " << (tm2-tm1)/1ms << " ms, Sleep took " << (tm3-tm2)/1ms << " ms
";
}


Produktion:


\_sleep took 250 ms, Sleep took 250 ms


Så det ser ud til at både \_sleep og Sleep sover for det specifikke antal millisekunder.

\_sleep er en MSVC CRT-funktion, og Sleep er en Windows API.

Så i MSVC bør de være udskiftelige.


En mindre forskel er, at i tilfælde af et 0 argument sover \_sleep for 1ms, mens Sleep ikke sover overhovedet.