الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الحصول على أقل توقيت للمقارنة بين إشارتين

بدأه عفتان في 20 أغسطس 2009 · 8 رد · 840 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

هل يمكن بلغة السي ++ الحصول على الوقت بالنانو ثانية أو أقل منها مثل بيكو ثانية ؟؟

ما أريد هو عمل كود يقارن بين إشارتين أو نبضتين حيث تدخل النبضة الأولى من مخرج الطابعة والنبضة الثانية من مخرج الطابعة وأريد المقارنة بينهما أيهما وصل أسرع من الآخر حيث وقت الحساب بالنانو ثانية أو بيكو ثانية

فما هي الدوال المناسبة لذالك ؟ وهل توجد دالة لحساب البيكو ثانية ؟؟

#2

نعم تستطيع و في الحقيقه واجهتني هذه المشكله قديماً لبناء Timer يعمل لاوقات قصيره جداً او كبيره دقيقه جداً.

// by Ali Al-Zyoud

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
using namespace System;

void main()
{
	LARGE_INTEGER  freq,time_s,time_en;
	float F,T1,T2;
			 QueryPerformanceFrequency(&freq);
			 F=freq.LowPart;
			 for(int j=0;j<10;j++){
				 printf("one second");//هنا ضع الجمل التي توود عملها
			 QueryPerformanceCounter(&time_s);
				   QueryPerformanceCounter(&time_en);
			 T2=time_s.LowPart;
			 T1=time_en.LowPart;
			 while(((T1 - T2 )/F)<0.1 ){//هنا ضع الوقت الذي تريده (بالمايكرو0.000001) 
				   QueryPerformanceCounter(&time_en);
			 T1=time_en.LowPart;	 
			 }

			 }

}

وكقاعده لا يوجد اي Timer جاهز بال C++ يعمل اقل من الميلي ثانيه من اي مكتبه وهذه الطريقه الوحيده التي وجدتها وهي رائعه جداً من حيث تحيدي الوقت وقد يصل الى نانو ثانيه او اقل لانه يقوم بعد عدد ال Clock Cycle بحسب تردد المعالج و بتالي يعطيك اقل وقت ممكن العمل من خلاله

اذا احتجت اي تفسير للكود انا جاهز

تم تعديل هذه المشاركة بواسطة Ali Al-Zyoud في 20 أغسطس 2009 في 11:26

#3

هذه طريقة أخرى تفيدك ان شاء الله.

  1.  
  2.  
  3. #include <ctime>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.  
  10. clock_t start, end;
  11.  
  12. start = clock();
  13. for(int i=0;i<10000;i++)
  14. cout<<i<<"r";
  15.  
  16. end = clock();
  17.  
  18. double diff = (double)(end - start)/(double)(CLOCKS_PER_SEC) ;
  19. cout<<diff<<endl;
  20. cin.get();
  21. return 0;
  22. }
  23.  
  24.  
  25.  

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 20 أغسطس 2009 في 07:36

tvquran_6.gif

#4

شكراً لكم اخواني Ali Al-Zyoud و فهدالشلوي على الأكواد

اذاً هل يمكن حساب النانوثانية بالوقت الفعلي ؟؟؟؟؟؟

#5

بحسب الكود الاول نعم وبدقه عاليه جداً وبالكود الثاني فقط لحد 1 مليثانيه وليس بدقه عاليه

#6

Ali Al-Zyoud

بارك الله فيك ونور دربك

#7

كنت قد صنعت class قائمة على الداله QueryPerformanceFrequency و QueryPerformanceCounter و هى تقوم بحساب الوقت المنقضى بالأسابيع و الأيام و الساعات و الدقائق و الثوانى و الميلى ثانيه و النانو ثانيه و الـ Ticks.

 

[color= #007f00; font-style: italic;]/************************************************************************/

[color= #007f00; font-style: italic;]/* Class Name    : HRTimer -> stands for High Resolution Timer          */

[color= #007f00; font-style: italic;]/* Class Version : 1.0.0                                                */

[color= #007f00; font-style: italic;]/* Class Creator : Muhammad alaa                                        */

[color= #007f00; font-style: italic;]/* Creation Date : 06/08/2009 10:04 AM                                  */

[color= #007f00; font-style: italic;]/* Description   : this is a high resolution timer used for calculating */

[color= #007f00; font-style: italic;]/*                 speed of an operation                                */

[color= #007f00; font-style: italic;]/************************************************************************/

 

[color= #007f00;]#ifndef HRTIMER_H

[color= #007f00;]#define HRTIMER_H

 

[color= #007f00;]#include "TimeSpan.h"

[color= #007f00;]#include <Windows.h>

 

[color= #007f00;]////////////////////////////////////////////////////

[color= #007f00;]////                                            ////

[color= #007f00;]////        THANKS FOR VBACCELERATOR.COM        ////

[color= #007f00;]////                                            ////

[color= #007f00;]////////////////////////////////////////////////////

 

[color= #0000ff;]class HRTimer

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

 

	HRTimer[color= #000000;]([color= #000000;]);

 

	[color= #0000ff;]bool      IsHRTimerExist[color= #000000;]([color= #000000;]); [color= #007f00;]// is this machine support hi-resolution timer

	LONGLONG  getTimerFrequency[color= #000000;]([color= #000000;]); [color= #007f00;]// get timer frequency

 

	[color= #0000ff;]void      Start[color= #000000;]([color= #000000;]); [color= #007f00;]// start timer

	[color= #0000ff;]void      Stop[color= #000000;]([color= #000000;]); [color= #007f00;]// stop timer

 

	[color= #0000ff;]double    getElapsedTime[color= #000000;]([color= #000000;]);

	TimeSpan[color= #000000;]* getTimeSpan[color= #000000;]([color= #000000;]);

 

[color= #0000ff;]private[color= #000000;]:

	LONGLONG _period; [color= #007f00;]// represent start_time and difference between start_time and end_time

	[color= #0000ff;]bool     _HRexist; [color= #007f00;]// is hr timer exist in this machine

	LONGLONG _Frequency; [color= #007f00;]// timer frequency

[color= #000000;]};

 

[color= #007f00;]#endif

فقط قم بإستدعاء Start قبل العمليه ثم Stop بعدها ثم بعد ذلك قم بإستدعاء الداله getTimeSpan و التى تعود بمؤشر لكائن TimeSpan و هو struct موجود مع الـ class فى ملف اسمه TimeSpan.h و منه تستطيع معرفة الوقت المنقضى بالقيمه التى تريدها.

 

[color= #007f00;]#include "HRTimer.h"

[color= #007f00;]#include "TimeSpan.h"

[color= #007f00;]#include <iostream>

[color= #0000ff;]using [color= #0000ff;]namespace std;

 

[color= #0000ff;]void main[color= #000000;]([color= #000000;])

[color= #000000;]{

   HRTimer t;

   t.[color= #808000;]Start[color= #000000;]([color= #000000;]);

   [color= #007f00;]// some code here

   t.[color= #808000;]Stop[color= #000000;]([color= #000000;]);

 

   TimeSpan[color= #000000;]* ts [color= #000000;]= t.[color= #808000;]getTimeSpan[color= #000000;]([color= #000000;]);

 

   cout [color= #000000;]<< ts.[color= #808000;]getNanoSecond[color= #000000;]([color= #000000;]) [color= #000000;]<< endl;

cout [color= #000000;]<< ts.[color= #808000;]getTotalNanoseconds[color= #000000;]([color= #000000;]) [color= #000000;]<< endl;

[color= #000000;]}

HRTimer.rar

و الله ولى التوفيق

1

مدونتي: C++ Tips and Tricks

#8

السلام عليكم ....

اقتباس
هل يمكن بلغة السي ++ الحصول على الوقت بالنانو ثانية أو أقل منها مثل بيكو ثانية ؟؟

إذا كنت تريد الوقت بهذه الدقة, فيجب أن تبحث في وثائق النظام الذي تعمل عليه. هذا ليس من مهام لغات البرمجة, حتى لو توفر في المكتبة القياسية للغة مؤقت, فإنه من شبه المستحيل أن يتوفر بهذه الدقة.

في Windows لا أعتقد أنه يمكنك الحصول على هذه الدقة, إلا لو قمت بكتابة driver, أما في الـ usermode فإنه لا يمكنك الحصول على هذه الدقة. لأن نظام Windows ليس real-time system. يمكنك مراجعة MSDN لمعرفة الدقة التي توفرها الدوال التي وضعها الأخوة :)

تحياتي ...

#9

يمكنك النظر فى نسخة معدلة من لينكس للوقت الحقيقى

http://rt.wiki.kernel.org/index.php/Main_Page

لعل ان تجد ضالتك فيها

name : mohamedyosry

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…