超实用“伪同步”设计代码,用处多多
来源:互联网 发布:caffe 中文教程 编辑:程序博客网 时间:2024/04/28 19:57
想想做软件的各位,肯定会碰到这种情况:
一个任务需要多个步骤完成,且中间步骤又可能是个异步的操作,这样要完成整个任务假如采用异步方式的话那代码关系很复杂。举个例子,使用http下载一个文件,当要支持另存这个文件时,首先要弹出一个路径选择的对话框,选择好以后继续进行后续数据的写入。很明显,使用同步代码来完成这样的任务看起来会简单非常多,而且代码逻辑也更清晰明了。下面的代码就是为这个设计的,非常好用、实用~
备注(使用说明):
1. 适合线程内同步等待(不会挂起线程,线程还是活的)
2. 需要同步等待的地方调用:TInt CFakeSyncAO::NewL(TInt aTimeout)
@aTimeout: 等待超时时间(微秒)
@ret:结束原因(一般0表示成功,其他表示失败)
3. 在其他地方完成后调用:void CFakeSyncAO ::StopSyncWait(TInt aError)
@aError:结束同步等待,结束原因
头文件:FakeSyncAO.h
- /*
- ============================================================================
- Name : FakeSyncAO.h
- Author : Alex
- Version : 1.0
- Copyright : Your copyright notice
- Description : CTraceLog declaration
- ============================================================================
- */
- #ifndef __FAKESYNCAO_H__
- #define __FAKESYNCAO_H__
- #include <e32base.h>
- class CPeriodic;
- class CFakeSyncAO : public CActive
- {
- public:
- static TInt NewL(TInt aTimeout=0);
- static void StopSyncWait(TInt aError=0);
- ~CFakeSyncAO();
- protected:
- void DoCancel();
- void RunL();
- private:
- static CFakeSyncAO* NewLC(TInt aTimeout);
- CFakeSyncAO(TInt aTimeout);
- void ConstructL();
- void StartSyncWait();
- static TInt OnTimeout(TAny* aObj);
- private:
- CActiveSchedulerWait iWait;
- CPeriodic* iTimeout;
- TInt iTimeDelay;
- };
- #endif
- #include "fakeSyncAO.h"
- CFakeSyncAO* g_SyncWaitAo = NULL;
- TInt CFakeSyncAO::NewL(TInt aTimeout)
- {
- TInt ret = 0;
- g_SyncWaitAo = NewLC(aTimeout);
- g_SyncWaitAo->StartSyncWait();
- ret = g_SyncWaitAo->iStatus.Int();
- CleanupStack::PopAndDestroy();
- g_SyncWaitAo = NULL;
- //signal coming, delete self
- return ret;
- }
- void CFakeSyncAO::StopSyncWait(TInt aError)
- {
- if(g_SyncWaitAo!=NULL && g_SyncWaitAo->IsActive())
- {
- TRequestStatus* status = &(g_SyncWaitAo->iStatus);
- User::RequestComplete(status,aError);
- }
- }
- CFakeSyncAO* CFakeSyncAO::NewLC(TInt aTimeout)
- {
- CFakeSyncAO* self = new (ELeave) CFakeSyncAO(aTimeout);
- CleanupStack::PushL(self);
- self->ConstructL();
- return self;
- }
- CFakeSyncAO::CFakeSyncAO(TInt aTimeout)
- :CActive(CActive::EPriorityLow)
- {
- iTimeDelay = aTimeout;
- }
- CFakeSyncAO::~CFakeSyncAO()
- {
- Cancel();
- }
- void CFakeSyncAO::ConstructL()
- {
- CActiveScheduler::Add(this);
- }
- void CFakeSyncAO::StartSyncWait()
- {
- if(iTimeDelay != 0)
- {
- iTimeout = CPeriodic::New(CActive::EPriorityStandard);
- iTimeout->Start(iTimeDelay,KMaxTInt32,TCallBack(CFakeSyncAO::OnTimeout,this));
- }
- SetActive();
- iStatus = KRequestPending;
- iWait.Start();
- }
- void CFakeSyncAO::DoCancel()
- {
- }
- TInt CFakeSyncAO::OnTimeout(TAny* aObj)
- {
- CFakeSyncAO* obj = (CFakeSyncAO*)aObj;
- if(obj->iWait.IsStarted())
- {
- obj->iWait.AsyncStop();
- }
- return 0;
- }
- void CFakeSyncAO::RunL()
- {
- if(iWait.IsStarted())
- {
- iWait.AsyncStop();
- }
- }
- 超实用“伪同步”设计代码,用处多多
- 超实用CSS代码
- 超实用PHP代码
- Android SQL 超实用设计
- 部分实用代码超链
- 《超实用的代码片段》
- android超实用代码块
- 数据结构之图论算法伪代码(伪代码是一种思想可对照伪代码的实用代码学习算法设计)
- 30段超实用CSS代码
- 30段超实用CSS代码
- 30段超实用CSS代码
- 30段超实用CSS代码(1)
- 30段超实用CSS代码 (2)
- 超实用的PHP代码片段
- 超实用的PHP代码片段!
- 九个超实用的PHP代码片段
- 超实用的JavaScript代码大全
- 40个超实用的web设计工具
- Linux内核分析-异常处理
- 2009年28个省市自治区424个城市GDP
- 联系方式
- 国际网络收款工具Paypal注册图文教程
- 我的第一个JAVA计算器
- 超实用“伪同步”设计代码,用处多多
- 字符串子串无重复字符最长长度的问题
- 方便、好用、强大的Symbian日志类,请务必收藏~
- 喜欢你,即使是暗恋
- 水晶报表中如何动态增加字段
- eclipse 快捷键总结
- Prototype&Production
- Nutch1.2增加插件例子
- 总结:如何查询SQL Server连接数