इंट्री मिलि और फ्लोट सेकंड के रूप में <chrono> से अवधि कैसे प्राप्त करें?


94

मैं टाइमर और अवधि के लिए क्रोनो लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं।

मैं एक Duration frameStart;(app शुरू से) और एक Duration frameDelta;(फ्रेम के बीच का समय ) करने में सक्षम होना चाहता हूँ

मुझे frameDeltaमिलीसेकंड और फ्लोट सेकंड के रूप में अवधि प्राप्त करने में सक्षम होना चाहिए ।

आप इसे नए c ++ 11 <chrono>पुस्तकालयों के साथ कैसे करते हैं ? मैं इस पर काम कर रहा हूँ और googling (जानकारी विरल है)। कोड को भारी रूप दिया गया है और इसके लिए विशेष कास्ट और चीजों की आवश्यकता है, मैं यह नहीं जान सकता कि इस लाइब्रेरी का सही उपयोग कैसे किया जाए।


अवधि को सेकंड सेकंड (या मिलीसेकंड) के साथ निर्दिष्ट करें और फिर उस countपर कॉल करें ...
K-ballo

ऑटो डेल्टा = अवधि_कास्ट <सेकंड> (फ्रेमडेल्टा) .count (); इस कदर? यह लंबे समय तक तैरता नहीं है।
एडीवी 223

3
@ K-ballo, यदि अवधि आपके द्वारा असाइन किए गए प्रकार से अधिक रिज़ॉल्यूशन है, तो सटीकता खोने से बचने के लिए असाइनमेंट बीमार हो जाएगा। आपको फ्लोटिंग पॉइंट प्रतिनिधित्व के साथ एक अवधि का उपयोग करने की आवश्यकता है, या उपयोग करेंduration_cast
जोनाथन वेकली

@JonathanWakely: ओह, तो मैं इसे गलत इस्तेमाल कर रहा हूँ! :(
के-बैलो

जवाबों:


153

क्या यह आप देख रहे हैं?

#include <chrono>
#include <iostream>

int main()
{
    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::duration<float> fsec;
    auto t0 = Time::now();
    auto t1 = Time::now();
    fsec fs = t1 - t0;
    ms d = std::chrono::duration_cast<ms>(fs);
    std::cout << fs.count() << "s\n";
    std::cout << d.count() << "ms\n";
}

जो मेरे लिए प्रिंट करता है:

6.5e-08s
0ms

2
क्यों नहीं और autoपर उपयोग करें ? fsd
टेम्प्लेटेक्स

27
@rhalbersma: उपयोग की autoके लिए ठीक होगा d, के परिणाम के रूप duration_cast<ms>है ms। हालांकि fs autoयह उचित नहीं होगा क्योंकि परिणाम का t1-t0प्रकार है high_resolution_clock::durationजो जरूरी नहीं कि उसी प्रकार का है duration<float>। उदाहरण के लिए मेरे सिस्टम पर यह है duration<long long, nano>। इसलिए उस लाइन पर इंटीग्रल-आधारित nanosecondsफ्लोट-आधारित secondsहोने से एक अंतर्निहित रूपांतरण होता है , केवल इसलिए कि गंतव्य प्रकार के साथ निर्दिष्ट किया गया है fsec
हावर्ड हिनांत

2
यह उपयोगी जानकारी है। बस जिज्ञासु: auto fs = std::chrono::duration_cast<fsec>(t1 - t0);पांडित्य ओवरकिल होगा?
टेम्प्लेक्स

@rhalbersma: यह भी काम करेगा, और ठीक यही काम करेगा। जहां तक ​​पसंद किया जाना चाहिए वह पूरी तरह से शैलीगत है जहां तक ​​मेरा संबंध है।
हावर्ड हिनान्ट

2
ज्ञात हो कि कुछ वास्तविक विश्व परिदृश्यों में (उदाहरण के लिए ms संकलक और पुस्तकालय) 'high_resolution_clock' microseconds के आदेश पर बार-बार याद आएगा और यह कोड शून्य से बाहर थूक देगा,
jheriko #

19

यह अनुमान लगा रहे हैं कि आप यह क्या माँग रहे हैं। मुझे लगता है कि मिलीसेकंड फ्रेम टाइमर द्वारा आप कुछ ऐसा खोज रहे हैं जो निम्नलिखित की तरह काम करता है,

double mticks()
{
    struct timeval tv;
    gettimeofday(&tv, 0);
    return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;
}

लेकिन std::chronoइसके बजाय का उपयोग करता है ,

double mticks()
{
    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::duration<float, std::milli> duration;

    static clock::time_point start = clock::now();
    duration elapsed = clock::now() - start;
    return elapsed.count();
}

उम्मीद है की यह मदद करेगा।


ढेर अतिप्रवाह में आपका स्वागत है। यह बहुत अच्छा होगा यदि आप अपने कोड के लिए सशर्त विवरण प्रदान कर सकते हैं। यह अन्य लोगों को यह समझने में मदद करेगा कि आप क्या करने की कोशिश कर रहे हैं और आपके समाधान कैसे काम करते हैं। धन्यवाद!
लुइज़ क्रूज़

FYI करें - यह CLEAREST था, दर्जनों मैंने समीक्षा की सबसे उपयोगी उदाहरण। अनंत काल-भ्रमित करने वाले क्रोनो कार्यों को समझने के लिए धन्यवाद।
SMGreenfield

15

मुझे नहीं पता कि "मिलीसेकंड और फ्लोट सेकंड" का क्या मतलब है, लेकिन यह आपको एक विचार देना चाहिए:

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
  auto then = std::chrono::system_clock::now();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto now = std::chrono::system_clock::now();
  auto dur = now - then;
  typedef std::chrono::duration<float> float_seconds;
  auto secs = std::chrono::duration_cast<float_seconds>(dur);
  std::cout << secs.count() << '\n';
}

मुझे लगता है कि वह countएक के रूप में वास्तविक चाहता है float?
K-ballo

1
यही आखिर में छपता है। लेकिन मुझे नहीं पता था कि क्या वह एक पूर्णांक के रूप में मिलीसेकंड चाहता है, या दूसरी या पिछले से मिलीसेकंड।
जोनाथन वेकली

मैं एक क्रोनो से प्राप्त करने में सक्षम होना चाहता हूं :: अवधि एक मिलीसेकंड, या फ्लोट सेकंड (एक दूसरे के अंश) के रूप में
दर्शाई गई अवधि

हॉवर्ड का जवाब ठीक यही करता है
जोनाथन वेकली

8

में एएए शैली का उपयोग कर स्पष्ट रूप से मुहावरा प्रारंभकर्ता टाइप किया :

#include <chrono>
#include <iostream>

int main(){
  auto start = std::chrono::high_resolution_clock::now();
  // Code to time here...
  auto end = std::chrono::high_resolution_clock::now();

  auto dur = end - start;
  auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur);
  auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur);
  std::cout << i_millis.count() << '\n';
  std::cout << f_secs.count() << '\n';
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.