转自:http://blog.csdn.net/IamNieo/archive/2008/09/10/2910595.aspx
什么叫事务线程
举个例子:
我们写一个IM客户端的登录子线程,则该子线程会有这么几个事务要处理
No.1 TCP Socket物理连接
No.2 逻辑登录
No.3 好友在线查询
No.4 状态更新
我们通常的代码写法是
-
voidThreadLogin()
- {
-
try
- {
-
if(fail(物理连接))
-
throw;
-
if(fail(登录))
-
throw;
-
if(fail(查询好友))
-
throw;
-
if(fail(更新))
-
throw;
- }
-
catch(exception)
- {
- }
- }
串行的逻辑用串行的代码写,不太好看,况且中途如果主线程发出取消指令,还不好处理。
这里扩展的thread类,就是来解决这个问题的,他会提供给程序员一种事件处理的模式
-
classthreadLogin
- {
-
voidonEventConnect()
- {
- 物理连接
- }
-
voidonEventLogin()
- {
- 登录
- }
-
voidonEventQuery()
- {
- 查询
- }
-
voidonEventUpdate()
- {
- 更新
- }
- }
源码如下
虚拟函数thread::on_process()处理各种事务事件
虚拟函数thread::on_process_end()是所有事务处理完毕事件
虚拟函数thread::on_process_fail()是事务处理出现错误,这时所有事务被取消,线程终止
这里给一个简单的范例,
总共线程要完成3件事务,其中第二个事务要求用户确认是否继续
- #definePROCESS_11
- #definePROCESS_22
- #definePROCESS_33
-
classthdex:publicthread
- {
-
public:
-
virtualvoidon_process()
- {
-
thread::on_process();
-
if(this->level==PROCESS_1)
- {
-
cout<<"workonprocess1..."<<endl;
- Sleep(100);
-
cout<<"process1done."<<endl;
-
this->next();
- }
-
elseif(this->level==PROCESS_2)
- {
-
cout<<"workonprocess2..."<<endl;
-
this->timeout=-1;
-
if(IDNO==::MessageBox(0,"areyourwantcontinue?","ask",MB_ICONQUESTION|MB_YESNO))
- {
-
this->lasterror="canceledbyuser";
-
this->fail();
- }
-
else
- {
- Sleep(100);
-
cout<<"process2done."<<endl;
-
this->next();
- }
- }
-
elseif(this->level==PROCESS_3)
- {
-
cout<<"workonprocess3..."<<endl;
- Sleep(100);
-
cout<<"process3done."<<endl;
-
this->next();
- }
- }
-
virtualvoidon_process_fail()
- {
-
cout<<this->lasterror<<endl;
- }
-
virtualvoidon_process_end()
- {
-
cout<<"allprocessdone."<<endl;
- }
- };
-
int_tmain(intargc,_TCHAR*argv[])
- {
- thdext;
- t.safestart();
- t.startprocess(PROCESS_1,PROCESS_3);
-
charbuf[10];
-
gets_s(buf,sizeofbuf);
- t.safestop();
-
return0;
- }
thread事务还支持超时设定和重试次数设定,这里就不做介绍,读者可以自己研究代码。
分享到:
相关推荐
boost159-locale-1.59.0-2.el7.x86_64.rpm
boost159-openmpi-python-1.59.0-2.el7.1.x86_64.rpm
boost159-filesystem-1.59.0-2.el7.x86_64.rpm
boost159-regex-1.59.0-2.el7.1.x86_64.rpm
matlab 2014b 破解缺少dll,boost_date_time-vc100-mt-1_49.dll,以及boost_filesystem-vc100-mt-1_49.dll
boost代码----------
boost159-1.59.0-2.el7.x86_64.rpm
boost159-program-options-1.59.0-2.el7.x86_64.rpm
boost线程指南手册。Boost 1.35.0的中文版。
boost----mysql connector c++ for visual studio 2008
boost159-atomic-1.59.0-2.el7.x86_64.rpm
基于Buck_Boost的AC--AC变换器设计方案pdf,基于BuckBoost的ACAC变换器设计.pdf
matlab 2016a 由于找不到 boost_iostreams-vc120-mt-1_56.dll,无法继续执行代码。重新安装程序可能会解决此问题。
《xapp1206-boost-sw-performance-zynq7soc-w-neon.pdf》 xilinx开发手册,指导手册.官方文档
离线安装包,亲测可用
boost159-build-1.59.0-2.el7.noarch.rpm
boost159-filesystem-1.59.0-2.el7.1.x86_64.rpm
离线安装包,测试可用
离线安装包,亲测可用
boost159-iostreams-1.59.0-2.el7.x86_64.rpm