使用boost线程定时器作为后台线程来切换主循环程序状态方法2

上一篇的方法主要使用的是:通过线程延时实

现的定时,并且只能定时一次,如果需要对此定时处理,就需要使用下面的定时器;

#include "stdafx.h"
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::asio;
using namespace boost;
using namespace std;

//循环状态
enum program_state
{
	state1,
	state2,
	state3,
	state4
};

/*
 定时器类的作用:将外部类的超时函数传递进来后,在定时器超时函数中进行调用;
 这样类之间的关系,清晰明了
*/
class ctimer
{
private:
	int		_timeout_len;
	bool	_is_remove_when_timeout;//
	boost::function<void()> f;		//委托函数类型为无参数无返回值
	thread* ptrThread;
public:
	//外部函数
	//
	~ctimer()
	{
		if (ptrThread != NULL)
		{
			delete this->ptrThread;
			this->ptrThread = NULL;
		}
	}
	template<typename F>
	void InstallTimer(F f, int _timeout_len, bool _is_remove_when_timeout)
	{
		this->_timeout_len = _timeout_len;
		this->_is_remove_when_timeout = _is_remove_when_timeout;
		this->f = f;
		//开启线程
		ptrThread=new thread(bind(&ctimer::setTimer, this));
	}
	void RemoveTimer()
	{
		this->_is_remove_when_timeout = true;
		this->_timeout_len = 1;
		this->f = NULL;
	}
	//定时器线程工作者函数
	void setTimer()
	{	

		io_service m_ios;

		//设置定时器,并设置回调函数
		deadline_timer t( m_ios, boost::posix_time::millisec(this->_timeout_len));
		t.async_wait(bind(&ctimer::timeout,this));//回调

		//阻塞在这里,等待事件
		m_ios.run();

		cout << "thread quit"<<endl;
	}
	//回调函数
	void timeout()
	{
		//回调函数中调用外部的处理程序
		if (this->f!=NULL)
			this->f();
		if (this->_is_remove_when_timeout == false)
		{
			thread(bind(&ctimer::setTimer, this));
		}
	}
};

//测试类,工作者主类
class TestClassA
{
public:
	//定时器类对象
	ctimer* ptrTimer;
	TestClassA()
	{
		state = state1;
		ptrTimer = new ctimer;
	}
	~TestClassA()
	{
		delete ptrTimer;
	}

	//主程序当前状态
	program_state state;

	//当前状态定时器超时处理函数
	void  TimeoutCallbackPrint()
	{
		printf(" TimeoutCallbackPrint\n");

		ptrTimer->RemoveTimer();//直接关闭定时器
		this->state = state2;
	}
	void run()
	{
		while (1)
		{
			//状态循环扫描
			switch (this->state)
			{
			case state1:
				proc_state1();
				break;
			case state2: break;
			}

		}
	}
	//主程序当前状态,处理函数
	void proc_state1()
	{
		//加入定时器,并将定时器回调函数的需要处理函数传入进去,并将参数传入
		ptrTimer->InstallTimer(bind(&TestClassA::TimeoutCallbackPrint,this),500, false);

		//死循环,进行收发处理
		while (this->state == state1)
		{
		}
	}
};

int _tmain(int argc, _TCHAR* argv[])
{	

	TestClassA *tc = new TestClassA();
	tc->run();//主程序在类中循环
	getchar();
	return 0;
}
时间: 2024-10-09 23:55:22

使用boost线程定时器作为后台线程来切换主循环程序状态方法2的相关文章

GCD12 :创建并发线程 和 调用后台线程

问题: 你想在程序中运行单独的任务时,拥有最大的控制权.例如,你想要根据用户要求,来运行一个长计算请求,同时,主线程 UI 可以自由的与用户交互和做别的事情. 讨论: 在程序中使用线程: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *fileToDownload = @"http://www.

后台线程(守护线程)

有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种线程被称为“后台线程”(Daemon Thread),又称为“守护线程”. 典型的后台线程是定时器”Timer"线程,他负责将固定的时间间隔发送给其他的线程. 后台线程经常用于任务结束时的善后处理.另外,后台线程的优先级要比其他的线程优先级低. 和后台线程相比,一般的线程称为“用户线程”.如果一个应用中只有后台线程在运行,JVM将退出该应用程序. 可以通过setDaemon(boolean d)来将一个普通的线程设置为后台线程.用

C#前台线程与后台线程的区别和联系 (转)

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出:而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束. .net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止.主线程就是一个前台线程.而后台线程不管

JAVA并发,后台线程

1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.TimeUnit; 4 5 /** 6 * 后台线程测试 7 * 8 * @author Administrator 9 * 10 */ 11 public class SimpleDaemonTest implements Runnable { 12 13 @Override 14 public void run() { 15 // TODO Auto-generated

Java多线程之后台线程

将线程设置成后台线程Daemons 主线程结果后,后台线程将自动结果. package wzh.test; import java.util.concurrent.TimeUnit; class SimpleDaemons implements Runnable{ @Override public void run() { try { while (true) { TimeUnit.MILLISECONDS.sleep(100); System.out.println(Thread.curren

守护线程(后台线程)与非守护线程(用户线程,前台线程)

当前台线程结束后,jvm将直接杀死后台线程,并且后台线程不会去执行finally代码块中的内容 public class DemoThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub try { Thread.currentThread().sleep(1000); System.out.println("我是非守护线程"); } catch (Inte

08_控制线程_后台线程(守护线程)

[后台线程] 后台线程(Daemon Thread):运行在后台,他的任务是为其它的线程提供服务,又称为"守护线程".JVM的垃圾回收线程就是典型的后台线程. [ 特征 ] 如果所有的前台线程都死亡,后台线程会自动死亡. 调用Thread对象的setDaemon(true)方法可以将指定的线程设置成后台线程. 当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了. Thread类提供了一个isDaemon()方法,用来判断指定线程是否为后台线程. [示例代码

前台线程和后台线程的选择

什么时候用Thread ,, 什么时候用 ThreadPool.. 当符合以下条件时就用Thread对象,否则还是用线程池较好. 1.你需要线程允许一个非普通优先级.所有的线程池线程都允许在普通优先级.当然,这你可以改变,但是不推荐,在线程池操作过程中,优先级的改变不会持续. (线程的优先级..前台线程要高于后台线程.即使改变了后台线程的优先级..也不会持久) 2.你需要线程作为前台线程运转,从而防止程序终止一直到线程完成任务.线程池线程总是后台线程,如果CLR决定终止进程它们就不会完成任务.

C#.Net前台线程与后台线程的区别

本文来自:http://www.cnblogs.com/zfanlong1314/archive/2012/02/26/2390455.html .Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出:而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束. .Net环境使用Thread建立的线程默认情况下是前