<ক্রোনো> থেকে ইন্টি মিলি এবং ভাসমান সেকেন্ড হিসাবে কীভাবে সময়কাল পাবেন?


94

আমি টাইমার এবং সময়কালের জন্য ক্রোনো লাইব্রেরিটি ব্যবহার করার চেষ্টা করছি।

আমি একটি Duration frameStart;(অ্যাপ্লিকেশন শুরু থেকে) এবং একটি Duration frameDelta;(ফ্রেমের মধ্যে সময় ) পেতে সক্ষম হতে চাই

আমার frameDeltaসময়কালটি মিলি সেকেন্ড এবং ভাসমান সেকেন্ড হিসাবে পেতে সক্ষম হওয়া দরকার ।

আপনি নতুন সি ++ 11 <chrono>লাইব্রেরি দিয়ে এটি কীভাবে করবেন ? আমি এটিতে কাজ করছি এবং গুগল করছি (তথ্য বিরল)। কোডটি ভারীভাবে তাত্পর্যযুক্ত এবং এতে বিশেষ ক্যাস্ট এবং জিনিসগুলির প্রয়োজন হয়, আমি কীভাবে এই লাইব্রেরিটি সঠিকভাবে ব্যবহার করতে পারি তা বুঝতে পারি না।


অনুপাত সেকেন্ড (বা মিলিসেকেন্ড) সহ একটি সময়কালকে সময় নির্ধারণ করুন এবং তারপরে কল countকরুন ...
কে-ব্যালো

অটো ডেল্টা = পিরিয়ড_কাস্ট <সেকেন্ড> (ফ্রেমডেল্টা) .কাউন্ট (); এটার মত? এটি দীর্ঘ সময় ভাসমান নয় returns
এডিভিভি 2323

4
@ কে-বেলো, যদি সময়সীমার দ্বারা নির্ধারিত ধরণের চেয়ে উচ্চতর রেজোলিউশন থাকে তবে যথাযথতা হারাতে না পারার জন্য অ্যাসাইনমেন্টটি গঠন করা হবে। আপনার একটি ভাসমান পয়েন্ট উপস্থাপনের জন্য একটি সময়কাল ব্যবহার করতে হবে, বা ব্যবহার করতে হবেduration_cast
জোনাথন ওয়েকেলি

@ জোনাথন ওয়াকলি: ওহ, তবে আমি এটিকে ভুল ব্যবহার করছি! :(
কে-বেলো

উত্তর:


154

এটি কি আপনি খুঁজছেন?

#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

4
কেন ব্যবহার করবেন autoউপর fsএবং d?
TemplateRex

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
হাওয়ার্ড হিন্যান্ট

4
এটি দরকারী তথ্য। শুধু কৌতূহলী: হবেauto fs = std::chrono::duration_cast<fsec>(t1 - t0); পেডেন্টিক ওভারকিল হবে?
TemplateRex

@ আরালবার্সমা: এটি ঠিক তেমন কাজ করবে এবং ঠিক একই কাজ করবে। যতটা আমার পছন্দের হওয়া উচিত পুরোপুরি শৈলীবদ্ধ।
হাওয়ার্ড হিন্নন্ত

4
জেনে থাকুন যে কিছু বাস্তব বিশ্বের পরিস্থিতিতে (এমএস সংকলক এবং গ্রন্থাগারগুলি উদাহরণস্বরূপ) 'হাই_রেসোলিউশন_ক্লোক' মাইক্রোসেকেন্ডের ক্রম অনুসারে সময়কে মিস করবে এবং এই কোডটি শূন্যগুলি ছাড়বে,
ছাড়বে

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();
}

আশাকরি এটা সাহায্য করবে.


স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। আপনার কোডটিতে অ্যাডিশনাল বিশদ সরবরাহ করতে পারলে দুর্দান্ত হবে great এটি অন্যদের বুঝতে সাহায্য করবে আপনি কী অর্জন করতে চাইছেন এবং কীভাবে আপনার সমাধানগুলি কাজ করে। ধন্যবাদ!
Lu:3s ক্রুজ

এফওয়াইআই - এটি পরিস্কার, আমি পর্যালোচনা করেছিলাম এমন কয়েকজনের মধ্যে সবচেয়ে দরকারী উদাহরণ। চির-বিভ্রান্তিক ক্রোনো ফাংশনগুলি বোধগম্য করার জন্য ধন্যবাদ।
এসএমগ্রিনফিল্ড

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?
কে-বালো

4
শেষে এটি মুদ্রিত হয়। তবে আমি জানতাম না যে তিনি পূর্ণসংখ্যার হিসাবে মিলিসেকেন্ডগুলি চান, বা দ্বিতীয়টি মিলিসেকেন্ডগুলি পেরিয়েছেন, বা কী।
জোনাথন ওয়াকলি

আমি একটি ক্রোনো থেকে পেতে সক্ষম হতে চাই: সময়কাল একটি ইন্টিমেট মিলিসেকেন্ড হিসাবে উপস্থাপন করা হয়, বা সেকেন্ড ভাসা সেকেন্ড (একটি সেকেন্ডের ভগ্নাংশ)
এডিভিভি ২২৩

হাওয়ার্ডের উত্তর ঠিক সেটাই করে
জোনাথন ওয়েকেলি

8

ইন AAA যাচাই শৈলী ব্যবহার স্পষ্টভাবে বাগ্ধারা সূচনাকারী টাইপ :

#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';
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.