今天闲来无事写了一个活动对象的测试代码,谁知道一运行死活跑不起来.程序执行到SetActive()就自动退出.硬是把这个简单的例子搞了2个小时.后来才知道原来Carbide.vs提供的Active框架没有重写NewL()或者NewLC()方法,而我直接调用new (ELeave) CActiveTest2NewClass;并没有初始化ConstructL()里面的数据.编译也不报错,Debug跟踪却是下面一行出问题.郁闷的要命.
下面的代码就是今天的收获:
CActiveTest2AppUi from ActiveTest2Appui.h
/*
============================================================================
Name : CActiveTest2AppUi from ActiveTest2Appui.h
Author :
Version :
Copyright : Your copyright notice
Description : Declares UI class for application.
============================================================================
*/
#ifndef ACTIVETEST2APPUI_H
#define ACTIVETEST2APPUI_H
// INCLUDES
#include <aknappui.h>
// FORWARD DECLARATIONS
class CActiveTest2Container;
class CActiveTest2NewClass;
// CLASS DECLARATION
/**
* Application UI class.
* Provides support for the following features:
* - EIKON control architecture
*
*/
class CActiveTest2AppUi : public CAknAppUi
{
public: // // Constructors and destructor
/**
* EPOC default constructor.
*/
void ConstructL();
/**
* Destructor.
*/
~CActiveTest2AppUi();
public: // New functions
public: // Functions from base classes
private:
// From MEikMenuObserver
void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane);
private:
/**
* From CEikAppUi, takes care of command handling.
* @param aCommand command to be handled
*/
void HandleCommandL(TInt aCommand);
/**
* From CEikAppUi, handles key events.
* @param aKeyEvent Event to handled.
* @param aType Type of the key event.
* @return Response code (EKeyWasConsumed, EKeyWasNotConsumed).
*/
virtual TKeyResponse HandleKeyEventL(
const TKeyEvent& aKeyEvent,TEventCode aType);
private: //Data
CActiveTest2Container* iAppContainer;
CActiveTest2NewClass* iTest2NewClass;
};
#endif
CActiveTest2AppUi from ActiveTest2Appui.cpp
/*
============================================================================
Name : CActiveTest2AppUi from ActiveTest2Appui.cpp
Author :
Version :
Copyright : Your copyright notice
Description : CActiveTest2AppUi implementation
============================================================================
*/
// INCLUDE FILES
#include "ActiveTest2Appui.h"
#include "ActiveTest2Container.h"
#include <ActiveTest2.rsg>
#include "ActiveTest2.hrh"
#include "ActiveTest2NewClass.h"
#include <avkon.hrh>
#include <aknnotewrappers.h>
// ================= MEMBER FUNCTIONS =======================
//
// ----------------------------------------------------------
// CActiveTest2AppUi::ConstructL()
//
// ----------------------------------------------------------
//
void CActiveTest2AppUi::ConstructL()
{
BaseConstructL();
iTest2NewClass = CActiveTest2NewClass::NewL();
iAppContainer = new (ELeave) CActiveTest2Container;
iAppContainer->SetMopParent( this );
iAppContainer->ConstructL( ClientRect() );
AddToStackL( iAppContainer );
}
// ----------------------------------------------------
// CActiveTest2AppUi::~CActiveTest2AppUi()
// Destructor
// Frees reserved resources
// ----------------------------------------------------
//
CActiveTest2AppUi::~CActiveTest2AppUi()
{
if (iAppContainer)
{
RemoveFromStack( iAppContainer );
delete iAppContainer;
}
if(iTest2NewClass)
{
delete iTest2NewClass;
}
}
// ------------------------------------------------------------------------------
// CActiveTest2AppUi::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
// This function is called by the EIKON framework just before it displays
// a menu pane. Its default implementation is empty, and by overriding it,
// the application can set the state of menu items dynamically according
// to the state of application data.
// ------------------------------------------------------------------------------
//
void CActiveTest2AppUi::DynInitMenuPaneL(
TInt /*aResourceId*/,CEikMenuPane* /*aMenuPane*/)
{
}
// ----------------------------------------------------
// CActiveTest2AppUi::HandleKeyEventL(
// const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
// takes care of key event handling
// ----------------------------------------------------
//
TKeyResponse CActiveTest2AppUi::HandleKeyEventL(
const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
{
return EKeyWasNotConsumed;
}
// ----------------------------------------------------
// CActiveTest2AppUi::HandleCommandL(TInt aCommand)
// takes care of command handling
// ----------------------------------------------------
//
void CActiveTest2AppUi::HandleCommandL(TInt aCommand)
{
switch ( aCommand )
{
case EAknSoftkeyBack:
case EEikCmdExit:
{
Exit();
break;
}
case EActiveTest2CmdAppTest:
{
// Info message shown only in the emulator
//iEikonEnv->InfoMsg(_L("test"));
//Load localized message from the resource file
//HBufC* message = CEikonEnv::Static()->AllocReadResourceLC(R_MESSAGE_TEXT);
// Show information note dialog
//CAknInformationNote* note = new (ELeave) CAknInformationNote;
//note->ExecuteLD(message->Des());
//CleanupStack::PopAndDestroy(message);
iTest2NewClass->StartL(3000000);
break;
}
// TODO: Add Your command handling code here
default:
break;
}
}
ActiveTest2NewClass.h
/*
============================================================================
Name : ActiveTest2NewClass.h
Author :
Version :
Copyright : Your copyright notice
Description : CActiveTest2NewClass declaration
============================================================================
*/
#ifndef ACTIVETEST2NEWCLASS_H
#define ACTIVETEST2NEWCLASS_H
#include <e32base.h>// For CActive, link against: euser.lib
#include <e32std.h>// For RTimer, link against: euser.lib
class CActiveTest2NewClass : public CActive
{
public:
// C++ constructor
CActiveTest2NewClass();
// Second-phase constructor
void ConstructL();
// Cancel and destroy
~CActiveTest2NewClass();
public: // New functions
// Function for making the initial request
void StartL(TTimeIntervalMicroSeconds32 aDelay);
//就是下面两个方法Carbide.vs没提供
static CActiveTest2NewClass* NewLC();
static CActiveTest2NewClass* NewL();
private: // From CActive
// Handle completion
void RunL();
// How to cancel me
void DoCancel();
// Override to handle leaves from RunL(). Default implementation causes
// the active scheduler to panic.
//void RunError(TInt aError);
private:
enum TActiveTest2NewClassState
{
EUninitialized,// Uninitialized
EInitialized,// Initalized
EError// Error condition
};
private:
TInt iState;// State of the active object
RTimeriTimer;// Provides async timing service
TInt iCount;
};
#endif
ActiveTest2NewClass.cpp
/*
============================================================================
Name : ActiveTest2NewClass.cpp
Author :
Version :
Copyright : Your copyright notice
Description : CActiveTest2NewClass implementation
============================================================================
*/
#include "ActiveTest2NewClass.h"
#include <eikenv.h >
CActiveTest2NewClass::CActiveTest2NewClass() : CActive(EPriorityStandard)// Standard priority
{
}
void CActiveTest2NewClass::ConstructL()
{
User::LeaveIfError(iTimer.CreateLocal());// Initialize timer
CActiveScheduler::Add(this);// Add to scheduler
}
CActiveTest2NewClass* CActiveTest2NewClass::NewLC()
{
CActiveTest2NewClass* self = new (ELeave) CActiveTest2NewClass;
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CActiveTest2NewClass* CActiveTest2NewClass::NewL()
{
CActiveTest2NewClass* self = NewLC();
CleanupStack::Pop(self);
return self;
}
CActiveTest2NewClass::~CActiveTest2NewClass()
{
Cancel(); // Cancel any request, if outstanding
// Delete instance variables if any
}
void CActiveTest2NewClass::DoCancel()
{
iTimer.Cancel();
}
void CActiveTest2NewClass::StartL(TTimeIntervalMicroSeconds32 aDelay)
{
Cancel();// Cancel any request, just to be sure
iState = EUninitialized;
iTimer.After(iStatus, aDelay);// Set for later
SetActive();// Tell scheduler a request is active
}
void CActiveTest2NewClass::RunL()
{
if (iState == EUninitialized) {
// Do something the first time RunL() is called
//iState = EInitialized;
iCount++;
_LIT(TempString,"the iCount's value is :");
HBufC* iBuf = HBufC::NewLC(100);
iBuf->Des().Copy(TempString);
iBuf->Des().AppendNum(iCount);
CEikonEnv::Static()->InfoMsg(*iBuf);
CleanupStack::PopAndDestroy(iBuf);
} else if (iState != EError) {
// Do something
}
iTimer.After(iStatus, 3000000);// Set for 1 sec later
SetActive();// Tell scheduler a request is active
}
另外就是以下几点收获:
1:debug到某一行出错并不代表就是这行的错误,可能是它上面一行,要看debug窗口里面红色显示的内容.
2:在epoc32\wins\c\system\Bootdata下面建一个ErrRd文件(无扩展名),可以让程序在关闭退出的时候报一个错误码.例如我的这个错误报kern-exec 0.之后可以到
http://www.symbian.com/developer/techlib/v70docs/SDL_v7.0/doc_source/reference/SystemPanics/index.html#PanicsReference%2eindex
查找这个错误的原因.
分享到:
相关推荐
标题中的“dateandtime”和“s60活动对象测试例子”揭示了这个示例程序主要涉及S60平台上的日期和时间显示,以及如何利用活动对象(Active Object)进行定时更新。S60是诺基亚开发的一个基于塞班(Symbian)操作系统...
在这个“java 算法实现只是一个简单的测试例子”中,我们将探讨如何使用Java语言来实现一个算法,尽管这仅是一个基础的测试示例。 Java是一种广泛使用的面向对象的编程语言,以其平台独立性和强大的类库而闻名。在...
为了测试这些方法,我们需要创建一个测试类,这个类通常会放在一个与实际代码分离的测试项目中。测试类中的每个方法代表一个测试用例,这些方法通常以`Test`开头,比如`TestDeposit`和`TestWithdraw`。 测试私有...
Mockito是一个流行的Java库,允许我们创建和配置mock对象。例如,如果一个函数依赖于网络请求,我们可以用Mockito模拟网络请求,以便只测试函数的行为,而不是网络交互。 3. **Android JUnit Runners**:为了在...
在Java编程语言中,了解一个对象占用的内存大小是非常重要的,尤其是在优化性能或者处理大量对象时。本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个...
OpenGL测试例子是一个用于验证OpenGL环境正确安装以及学习如何在屏幕上渲染简单图形的程序。OpenGL,全称Open Graphics Library,是一个跨语言、跨平台的应用程序编程接口(API),它专门用于生成2D和3D图形。这个...
**IKanalyzer分词器详解** IKAnalyzer是一款开源的、基于Java实现的中文分词工具,主要用于对中文文本进行分词处理。它以其高效、灵活的特性,...这个"IKanalyzer 分词小测试例子"是学习和掌握该工具的一个良好起点。
2. 设计一个含有多个菜单项的菜单演示程序,然后再为这些菜单项设计相应的功能。 要求: (1)程序显示下列菜单选项: 1. 解一元二次方程 2. 石头、剪子、布游戏 3. 退出程序 选择1-3: (2)用户选择1,则求解一元...
【标题】:“VS2008-免注册-单进程创建多个大漠对象-例子”这一标题揭示了我们讨论的核心内容:使用Visual Studio 2008开发环境,在同一个进程中无需注册即可创建多个“大漠”对象。大漠通常指的是大漠插件,这是一...
例如,我们可以设定一个方法在特定条件下被调用一次,返回特定的值。 3. **验证(Verification)**:测试完成后,EasyMock会验证模拟对象是否按照预设的方式被调用。如果未达到预期,测试将失败。 4. **回调...
Ruby是一种动态、面向对象的编程语言,而Selenium WebDriver是一个开源的自动化测试框架,支持多种浏览器和编程语言,其中包括Ruby。在这个“ruby+selenium-webdriver测试--第一个例子源代码”中,我们将探讨如何...
综上所述,“手电筒的测试例子”涵盖了硬件权限管理、API接口调用、设备兼容性、用户体验以及性能优化等多个方面,是Android开发中一个典型的小型但完整的项目实例。通过这个例子,开发者可以深入理解如何在实际应用...
**描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象(通常是Java类,对应数据库中的表)、一个辅助类(可能是配置或者工具类,帮助操作数据库)以及一个测试类(用于验证代码功能)。这个例子特别...
Dojo 是一个强大的JavaScript工具库,它为Web开发提供了丰富的功能和组件,包括AJAX、DOM操作、动画效果、事件处理、模块化等。在"dojo测试例子"中,我们很可能会涉及到以下Dojo的核心概念和技术: 1. **dojo加载器...
本教程将带你逐步了解如何在.NET环境中构建Spring.NET的第一个测试例子。 首先,我们需要了解Spring.NET的核心概念。依赖注入(Dependency Injection,简称DI)是Spring.NET的核心特性之一,它允许我们解耦应用程序...
标题中的“Excel测试小例子”表明这是一个关于使用C#编程语言与Excel交互的示例项目。在描述中提到“c#操作excel实例”,这暗示我们将探讨如何在C#环境中读取、写入或处理Excel文件。尽管这个压缩包可能不具有广泛的...
在这个“cas单点登录自己写的测试例子”中,开发者提供了一个包含客户端和服务器端的完整示例,旨在帮助理解并实践CAS SSO机制。这个项目使用Maven作为构建工具,方便管理和依赖的解决。 首先,我们来看一下CAS的...
3. **模拟(Mocking)**:Mockito是一个流行的Java模拟框架,允许我们在测试中替换真实对象以控制它们的行为。例如,我们可能会模拟某个服务,以确保我们的控制器在接收到特定输入时正确地调用了该服务。 4. **断言...
下面我们将深入探讨DWR的工作原理、配置过程以及如何创建一个简单的测试例子。 1. DWR的工作原理: DWR的核心在于它提供了一种安全的、跨域的通信方式。它通过JavaScript接口(JSR-269或JSR-173注解)动态生成...
QT网络测试例子是一个基于Qt库开发的项目,用于测试和演示Qt框架中的网络通信功能。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API来处理网络通信,使得开发者能够在不同操作系统上构建网络...