*進程
- 一個Symbian作業系統進程就是一個擁有資料區域,棧和堆的可執行程式
- 一個進程預設擁有8KB的棧空間和1MB的堆空間
- 在Symbian作業系統中,可以同時啟用多個進程
- 進程具有私人的地址空間,使用者側的進程無法直接存取其它使用者側進程的記憶體
- 預設情況下,一個進程包含一個主線程,同時可以建立附加線程
- 線程間切換比進程間切換需要的開銷要小的很多
*在Symbian作業系統中,使用RProcess來操作進程
*進程樣本
#include<e32base.h>
TInt E32Main() //E32Main()主函數是進程的起點
{
LIT(KMsgTxt,"Process");
for (TInt i=0; i<100; i++)
{
User::InfoPrint(KMsgTxt);
User::After(2000000);
}
return(0);
}
*運行進程
TInt RProcess::Create(const TDesC& aExceutableFile, const TDesC& aCommand, TOwnerType aType=EOwnerProcess)
EOwnerProcess預設的是所有的進程都可以調用這個進程,如果aType=EOwnerThread則表明只能被當前進程調用
void LaunchProcessL()
{
_LIT(KMyExeFile,"c://system//programs//MyProc.exe");
RProcess proc;
User::LeaveIfError(proc.Create(KmyExeFile,KNullDesC));
proc.Resume();//運行進程
……
proc.Close();
}
*設定和擷取進程參數
- 通過在Create()中設定第二個參數,可以傳遞命令列參數
void LaunchProcessWithArgL()
{
_LIT(KMyExeFile,"c://system//programs//MyProc.exe");
_LIT(KMyExeFileCmd,"-x 20 -y 30");
RProcess proc;
User::LeaveIfError(proc.Create(KMyExeFile,KMyExeFileCmd));
proc.Resume();//運行該進程
}
- 通過CommandLine()可以獲得命令列參數
TBuf<200> cmdLine;
RProcess me;
me.CommandLine(cmdLine);//把參數返回到cmdLine中
*處理序間通訊
- 可以通過Open()函數開啟其它進程
- Open()需要的參數為進程的ID或名字
RProcess myProcess;
myProcess.Open(Aprocld);
if (rc != KErrNone)
{
處理錯誤
}
……
myProcess.Close();//完成之後關閉控制代碼
*進程的名字
- 每個進程都有一個相關聯的ASCII名字
- 預設的進程名是包含該進程的exe檔案名稱(不包括尾碼名)
- 進程名可以通過Rename()函數進行修改
- 通過名字開啟進程的更好的方法是使用Open(TFindProcess& aFind)重載
RProcess proc;
_LIT(KMatchName,"MyProc*");
TFindProcess procName(KMatchName);
TInt rc = proc.Open(procName);//開啟的是第一個相匹配的進程
if (rc != KErrNone)
{
處理錯誤
}
*進程的優先順序
- 核心根據進程優先順序來判斷當多個進程需要同時執行時應該首先執行哪個進程
- 使用SetPriority()可以設定進程的優先順序 //也可以在mmp檔案中設定
- 進程的優先順序主要有
·EPriorityLow(150)
·EPriorityBackground(250)
·EPriorityForeground(350)
·EPriorityHigh(450)
*終止進程
- 通常情況下,進程運行完成之後(既E32Main()函數運行結束)會自動終止
- 也可以強制終止進程
·Kill(TInt aReason)
- aReason說明進程終止的原因
- 進程可以終止自己,或者終止其它進程
·Panic(const TDesC& aCategory, TInt aReason)
- 表示檢測到一些不可恢複的錯誤
- aCategory是指示錯誤類型的字串
- aReason給出更加具體的錯誤號碼