(1)進程
進程是一個正在啟動並執行應用程式的執行個體,它由兩部分組成:A,管理這個進程的作業系統的核心對象;B,該進程擁有的地址空間。每一個進程都有獨佔的、受到保護的32MB的地址空間。Windows CE系統最大允許32個獨立的進程同時進行。當系統啟動的時候,最少有4個預設的進程被啟動,即:nk.exe(提供有關核心的服務);filesys.exe(提供有關檔案系統的服務);gwes.exe(提供對GUI系統的支援);device.exe(裝載和管理裝置的驅動程式)。以下是一系列函數:
A,建立進程
BOOL CreatProcess(LPCTSTR lpApplicationName,
LPCTSTR lpCommandLine,
LPSECURITY_ATTRIBUSTES lpProcessAttributes,
LPSECURITY_ARRTIBUSTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnviromment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPPROCESS_INFORMATION lpProcessInformation);
因為Windows CE不支援安全性、繼承性和目前的目錄,所以這個API很多參數都必須設定成0或者False,即:
BOOL CreatProcess(LPCTSTR lpApplicationName, //應用程式的名稱
LPCTSTR lpCommandLine, //用於傳遞啟動參數,只能是Unicode
NULL,NULL,FALSE,
DWORD dwCreationFlags, //進程的狀態標誌
NULL,NULL,NULL,
LPPPROCESS_INFORMATION lpProcessInformation);//傳遞一個LPPPROCESS_INFORMATION結構的變數地址
其中,LPPPROCESS_INFORMATION結構體的定義為:
Typedef struct _PROCESS_INFORMATION{
HANDLE hProcess;
HANDLE hThread;
HANDLE dwProcessID;
HANDLE dwThreadID;
}PROCESS_INFORMATION
結構中前兩個參數hProcess和hThread分別為新建立進程的控制代碼和新建立進程中主線程的控制代碼。dwProcessID和dwThreadID則為進程的ID號和進程中主線程的ID號。
B,退出進程
VOID ExitProcess(UINT uExitCode);uExitCode為結束代碼。這個函數能徹底地實現進程的關閉功能,即,它將把進程終止的訊息通知所有和該進程關聯的動態連結程式庫(DLL)。可以通過下面的函數來獲得指定進程的結束代碼:
BOOL GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode);
一個進程處於運行狀態的時候,其結束代碼為STILI_ACTIVE。當一個進程被成功終止的時候,其終止狀態可能是下面的三種:
1,ExitProcess或者TerminateProcess函數指定的結束代碼;2,mian或者WinMain函數中的傳回值;3,引起進程異常終止的代碼。
如果想在當前進程中終止另一個進程,則可以使用下面的函數:
BOOL TerminateProcess(HANDLE hProcess,DWORD uExitCode);hProcess為控制代碼;uExitCode為結束代碼。
需要注意的是,使用TerminateProcess函數會無條件的終止相關進程,該進程中的所有線程也會被終止。同時,還會把進程終止的訊息同時給和這個進程有關的DLL檔案。
C,獲得進程ID
終止一個進程時,我們需要知道相應進程的控制代碼,同時在其他一些情況下,我們也需要知道一些進程的控制代碼。可以由以下函數來實現:
HANDLE OpenProcess(DWORD dwDesiredAccess, //Windows CE中設定為0
BOOL bInheritHandle, // Windows CE中設定為FALSE
DWORD dwProcessId) //表示想要開啟進程的ID
在Windows CE系統中,我們也可以使用另一種函數來獲得視窗的控制代碼,並得到相應進程的ID值。如:
GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);
(2)線程
除了一些在運行中必不可少的資源(如寄存器和棧等)外,線程本身並不佔有系統的資源。但線程卻可以和同屬於一個進程的另一個線程共用進程所擁有的全部資源。同進程一樣,一個線程可以建立或者撤消另一個線程,同一個進程內的線程也可以並發執行。
每一個進程中都包含一個主線程,通過一定的函數,在一個進程中可以建立許許多多的線程,在Windows CE中建立線程的數量只受記憶體空間大小和線程棧空間大小的影響。Windows CE 3.0之後,系統支援的優先順序增長到256個,0優先順序層級最高,255優先順序層級最低。其中:
0—96:優先順序高於驅動程式的程式;
97—152:基於Windows CE.Net的驅動程式;
153—247:優先順序低於驅動程式的程式;
248—255:普通的應用程式。
在Windows CE中,線程一般分為5個狀態,分別為運行狀態(running)、掛起(suspended)、睡眠(sleeping)、阻塞(blocking)、終止(terminated)。其中,當系統內所有的線程處於阻塞狀態的時候,系統的核心則處於空閑模式(Idle Model),此時對CPU的電力資源的佔用將減少。要知道,對於大多數靠電池供應電力的Windows CE裝置來說,對電力資源佔用的大小是至關重要的。一下是一系列函數:
A,設定線程的優先順序:
BOOL CeSetThreadPriority(HANDLE hThread,int nPriority);
B,查詢線程的優先順序別:
int CeGetThreadPriority(HANDLE hThread);
(3)處理序間通訊
Windows CE沒提供訊息、連接埠等複雜的通訊機制,而是提供了用於等待隊列的幾種基本的通訊手段。如,事件對象、互斥、臨界區等。這些都被以系統對象的形式來實現。所謂系統對象,就是由系統管理的資源實體,系統通過列表紀錄並跟蹤它們的狀態。
A,訊號量
在Windows CE中,當線程在等待訊號量的時候,該線程處於鎖住(blocked)狀態,這種狀態一直持續到可用資源大於0為止。可用資源的最大值是在建立訊號量的時候被指定的,因此我們可以通過訊號量來指定訪問資源的線程的數量。
HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //NULL
LONG lInitialCount, //當前可用資源的初始值
LONG lMaximumCount, //最大可用資源數量
LPCTSTR lpName); //對象的名字
當線程訪問完可用資源以後,將釋放訊號量。釋放訊號量的函數為:
BOOL ReleaseSemaphor(HANDLE hSemaphore, //對象的控制代碼
LONG lReleaseCount, //要釋放的資源數
LPLONG lpPreviousCount); //返回原來的可用資源數
當一個線程訪問完可用資源以後,必須使用ReleaseSemaphor函數釋放訊號量,以使當前可用資源數遞增。
B,互斥
互斥也是一種保證線程同步的手段之一,它能夠保證多個線程對同一共用資源的互斥訪問。只有擁有互斥對象的線程才具有訪問資源的許可權。同時,由於互斥對象只有一個,因此就決定了了任何情況下共用資源都不會同時被多個線程所訪問。建立一個互斥對象:
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, //設定成NULL
BOOL bInitialOwner, //TURE或者FALSE
LPCTSTR lpName); //互斥對象的名稱
當互斥對象被建立以後,如果我們想獲得這個互斥對象,首先應該通過GetLastError函數來驗證互斥資源是否已經被提交,如果已經被前一個使用它的線程提交,那麼我們就可以通過WaitForSingleObject函數來獲得這個互斥對象。釋放一個互斥對象:
BOOL ReleaseMutex(HANDLE bMutex);
C,互鎖函數
在Windows CE中,互鎖函數的作用是保證當一個線程訪問一個變數的時候,其他線程無法訪問此變數,以確保變數值的唯一性,這種訪問方式稱之為原子訪問。Windows CE支援完整的互鎖Win32API函數。
LONG InterlockedIncrement(LPLONG lpAddend);
這個函數使一個LONG類型的變數增加1,裡面的參數為指向這個變化變數的指標。
LONG InterlockedDncrement(LPLONG lpAddend);
這個函數使一個LONG類型的變數減少1,裡面的參數為指向這個變化變數的指標。
D,臨界區
臨界區是Windows CE系統內部最常用的互斥手段,它能保證在臨界區內所有被訪問的資源不被其他線程訪問,直到當前線程執行完臨界區的代碼為止。一般情況下,臨界區對象用於保證一段程式碼的不間斷性,一個臨界區對象的使用通常被限定在某一個進程或者動態連結程式庫中。與臨界區相關的函數主要有:
void InitializeCriticalSection(LPCRITICAL_SECTION);函數InitializeCriticalSection的作用是初始化臨界區;
void EnterCriticalSection(LPCRITICAL_SECTION);函數EnterCriticalSection的作用是進入臨界區;
void LeaveCriticalSection(LPCRITICAL_SECTION);函數LeaveCriticalSection的作用是退出臨界區;
void DeleteCriticalSection(LPCRITICAL_SECTION);函數DeleteCriticalSection的作用是撤銷臨界區;
參考原文:http://www.cevx.com/bbs/htm/board4/topic14334.htm