`
betty_betty2008
  • 浏览: 24699 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
最近访客 更多访客>>
社区版块
存档分类
最新评论

练习:boost.timer 转D2

    博客分类:
  • D
阅读更多
中间解决了好几个问题,尚有几个问题没解决,已在NG上提问。备忘

timer.d
module timer;

import core.stdc.time;

class Timer 
{
	private:
	core.stdc.time.clock_t _start_time;
	public:
	this()
	{
		_start_time=core.stdc.time.clock;
	}
	void restart()
	{
		_start_time=core.stdc.time.clock;
	}

	const double elapsed()
	{
		return cast(double)(core.stdc.time.clock-_start_time)/CLOCKS_PER_SEC;
	}
	const double elapsed_max()
	{
		return cast(double) (core.stdc.time.clock_t.max-_start_time)/cast(double)CLOCKS_PER_SEC;
	}
	const double elapsed_min()
	{
		return cast(double)(1)/cast(double)CLOCKS_PER_SEC;
	}
	
}


progress.d

module progress;
import std.stdio;
import core.stdc.stdlib;
import core.stdc.stdio;
import timer;

class progress_timer:Timer
{
	private:
	
	this(progress_timer lhs)
	{
	}

	progress_timer opAssign(progress_timer lhs)
	{
		progress_timer temp=lhs;
		
		return temp;
	}
	public:
	this(){}
	~this()
	{
		writefln("%.2f seconds elapsed so far.",elapsed);
	}
	
}
class progress_display
{
	private:

	string m_s1;
	string m_s2;
	string m_s3;

	ulong _count;
	ulong _expected_count;
	ulong _next_tic_count;

	uint _tic;

	private:
	void display_tic()
	{
		uint tics_needed= cast(uint)((cast(double)_count/_expected_count)*50.0);

		do
		{
			//printf("*");
			write('*');
			fflush(core.stdc.stdio.stdout);
			
		}while( ++_tic<tics_needed);

		_next_tic_count=cast(ulong)((_tic/50.0)*_expected_count);
		if( _count==expected_count)
		{
			if( _tic<51)
			{
				
				//printf("*");
				write('*');
				fflush(core.stdc.stdio.stdout);
			}
			putchar('\n');
			
		}
	}

	private:
	this()
	{
	}
	this(progress_display lhs)
	{
		//progress_display temp=lhs;
		//return temp;
	}
	progress_display opAssign(progress_display lhs)
	{
		progress_display temp=lhs;
		return temp;
	}

	public:
	this(ulong expected_count,
					string s1="\n",
					string s2="",
					string s3="")
	{
		m_s1=s1;
		m_s2=s2;
		m_s3=s3;
		restart(expected_count);
	}
	void restart(ulong expected_count)
	{
		_count= _next_tic_count=_tic=0;
		_expected_count=expected_count;

		write(m_s1);
		write("0%   10   20   30   40   50   60   70   80   90   100%\n");
		write(m_s2);
		write("|----|----|----|----|----|----|----|----|----|----|");
		write("\n");
		write(m_s3);
		if( ! _expected_count) 
			_expected_count=1;
	}

	ulong opAddAssign(ulong increment)
	{
		if((_count+=increment)>_next_tic_count)
		{
			display_tic;
		}
		return _count;
	}
	ulong opPostInc()
	{
		return opAddAssign(1);
	}
	const ulong count()
	{
		return _count;
	}
	const ulong expected_count()
	{
		return _expected_count;
	}
}



测试程序timer_test.d


module timerProject;

import timer;
import progress;

import std.stdio;
import std.c.stdlib;

static this()
{
	scope Timer t0=new Timer;

	writefln("timer.elapsed_min() reports %f seconds.", t0.elapsed_min);

	writefln("timer.elapsed_max() reports %f seconds,"
			"which is %.2f hours",t0.elapsed_max,t0.elapsed_max/3600.0);
	writefln("\nverify progress_display(0) doesn't divided by zero");
	scope progress_display zero=new progress_display(0);
	++zero;

	long loops;
	scope Timer loop_timer=new Timer;
	const double time=1.0;

	writefln("\ndetermine %.0f second iteration count",time);
	for(loops=0;loops<int.max && loop_timer.elapsed<time;++loops){}
	writefln("%d iterations",loops);

	long i;
	bool time_waster;

	scope progress_timer pt=new progress_timer;
	scope Timer t1=new Timer;
	scope Timer t4;//=new Timer;
	scope Timer t5=new Timer;

	writefln("\nburn about %.0f seconds.",time);
	scope progress_display pd=new progress_display(loops);

	for(i=loops;i>0;i--)
	{
		time_waster=loop_timer.elapsed<time;
		++pd;
	}
	scope Timer t2=t1;
	scope Timer t3=new Timer;
	t4=t3;

	
	t5.restart;

	writefln("\nburn about %.0f seconds again",time);
	pd.restart(loops);

	for(i=loops;i>0;i--)
	{
		time_waster=loop_timer.elapsed<time;
		++pd;
	}

	if(time_waster) write(" ");
	scope progress_display pd2=new progress_display(50,"\nLeading string 1",
			"Leading string 2","Leading string 3");
	for(;pd2.count<50;++pd2){}

	writefln("\nt1 elapsed:%f",t1.elapsed);
	writefln("\nt2 elapsed:%f",t2.elapsed);
	writefln("\nt3 elapsed:%f",t3.elapsed);
	writefln("\nt4 elapsed:%f",t4.elapsed);
	writefln("\nt5 elapsed:%f",t5.elapsed);

	writefln("t1 and t2 should report about the same times (very approximately %0.f seconds",
			2*time);
	writefln("t3,t4 and t5 should report the same times,\n"
		"and these should be about half the t1 and t2 times.\n"
		"The following elapsed time should be slightly greater than t1.");
			
	
}
int main(string[] args)
{
	
	getchar;
	return 0;
}
分享到:
评论
2 楼 betty_betty2008 2009-08-13  
惭愧,C++ BOOST 里有一个TIMER 的库,看起来相对简单一些,就练习了一下,转到D2后发现输出时间(D2 vx C++)差别挺大,在NG上提问,没人理;当初也没想着要发布在圈子里,这个博客有时傻傻D~~
1 楼 l250707449 2009-08-12  
高..硬是没看懂

相关推荐

    C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③...

    Boost.Asio c++网络编程源码

    Boost.Asio的定时器类(如`deadline_timer`和`high_resolution_timer`)允许程序在指定时间后执行操作,而信号处理器可以捕获和处理系统信号,如SIGINT(Ctrl+C)。 6. **C++17特性**: 在C++17标准下,Boost....

    Boost.Asio C++ Network Programming随书源码

    5. **定时器**:Boost.Asio提供了`deadline_timer`和`steady_timer`,它们可以用于设置超时或定期执行任务,是实现定时操作的重要工具。 6. **多路复用**:Boost.Asio通过`io_service::run()`方法实现了事件驱动的...

    Boost.orgtimermodule.zip

    1. **源代码**:可能有"boost/timer.hpp"头文件,定义了`boost::timer`类及其相关功能,以及实现这些功能的源代码文件。 2. **文档**:Boost库通常会提供详细的Doxygen格式的API文档,帮助开发者了解如何使用`boost:...

    Boost.Asio C++ Network Programming源代码

    - **异步编程模型**:Boost.Asio的核心是基于事件驱动的非阻塞I/O模型,这使得程序能够同时处理多个I/O操作,提高效率。 - **服务(Service)和执行器(Executor)**:服务代表了特定类型的I/O操作,而执行器负责...

    boost_timer

    1. **Boost.Timer库**:Boost.Timer库提供了一种简单的方法来度量程序运行的时间。它提供了不同精度的计时器,可以用来跟踪函数执行、任务完成或任何其他需要时间测量的事件。这个库主要包含两个类:`boost::timer`...

    C#关于System.Timer的用法

    要解决这个问题,可以使用`Timer.Change`方法将间隔设置为`Timeout.Infinite`,或者直接使用`Dispose`: ```csharp timer.Change(Timeout.Infinite, Timeout.Infinite); // 停止计时器 // 或者 timer.Dispose(); //...

    layer.timer

    "layer.timer"是一个基于layer框架的日期控件插件,它为Web应用提供了方便快捷的日期选择功能。layer是一款广泛使用的JavaScript弹层组件,能够帮助开发者轻松实现对话框、提示、加载层等多种页面交互效果。而layer....

    Boost.Asio C++ Network Programming

    - **定时器**:使用 `asio::steady_timer` 或 `asio::deadline_timer` 实现基于时间的操作。 - **信号处理**:监听系统信号(如 SIGINT 和 SIGTERM)并做出响应。 - **自定义分配器**:优化内存管理和性能。 ### ...

    system.Threading.Timer的使用

    Console.WriteLine("Press any key to stop the timer..."); Console.ReadKey(); // 停止计时器 timer.Change(Timeout.Infinite, Timeout.Infinite); } static void DisplayTime(object state) { Console....

    jquery.timer.js 动态显示时间

    《使用jquery.timer.js实现动态显示时间的深度解析》 在网页设计中,实时显示时间是一项常见的需求,例如倒计时、实时更新的时间戳等。jQuery作为一个广泛使用的JavaScript库,为开发者提供了丰富的功能和便利。而...

    JMeter测试视频教程

    课时12:5.GraghView Results 和Timer 定时器 课时13:6.Processor 处理器和Assertion断言 课时14:7.演示:掌握JMeter各元素的使用 课时15:JMeter-II.ppt 课时16:1.测试SQL Query的方法 课时17:2.演示:测试SQL Query ...

    Timer_0_mode_3_timer_gate_Soft.zip_Soft!_at89c51_site:www.pudn.c

    标题中的“Timer_0_mode_3_timer_gate_Soft.zip_Soft!_at89c51_site:www.pudn.com”暗示了这是一个关于AT89C51微控制器的程序,具体涉及到Timer 0工作在模式3,并且可能包含了定时器门控功能的软件实现。这个压缩包...

    Boost.Asio C++ Network Programming Cookbook

    《Boost.Asio C++ Network Programming Cookbook》是一本专注于C++网络编程的实用指南,它主要围绕Boost.Asio库展开,该库是C++标准库在处理异步I/O和网络编程方面的一个强大扩展。Boost.Asio是C++社区广泛认可的...

    Boost.Asio C++ Network Programming(2nd) Source Code

    《Boost.Asio C++ Network Programming(2nd) Source Code》是C++网络编程领域的一份珍贵资源,尤其对于深入理解Boost.Asio库的开发者来说,它提供了宝贵的实践材料。Boost.Asio是C++标准库的一个扩展,专注于网络...

    Boost Asio 示例代码

    Boost.Asio还提供了定时器类,如`deadline_timer`和`steady_timer`,用于安排在特定时间点执行操作。这对于超时控制和周期性任务非常有用。 6. **地址和端口处理**: 库包含了`ip::address`和`ip::endpoint`类,...

    c#各种Timer类的区别与用法介绍

    System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生。在此类情况下,System.Windows....

    详解C#中的System.Timers.Timer定时器的使用和定时自动清理内存应用

    C#中的System.Timers.Timer定时器使用和定时自动清理内存应用 C#中的System.Timers.Timer定时器是一种常用的定时器组件,用于在指定时间间隔内触发事件。该组件广泛应用于各种场景,如定时更新数据、定时清理内存、...

    C# Timer的多线程使用方法

    在.NET框架中,C#提供了两种Timer类,用于在多线程环境中实现定时触发操作:System.Threading.Timer和System.Timers.Timer。这两种Timer虽然都与时间调度相关,但在使用上和特性上有所不同。在这个主题中,我们将...

Global site tag (gtag.js) - Google Analytics