线程分工作者线程和用户界面线程两种。
线程创建函数原型:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
此函数用来创建工作者线程。
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
此函数用来创建用户界面线程。
参数:
pfnThreadProc 指向工作线程的控制函数。不能是NULL。这个函数必须按下面的方式定义:
UINT MyControllingFunction( LPVOID pParam );
pThreadClass 从CWinThread继承的对象的RUNTIME_CLASS。
pParam 将要传送给控制函数的参数,如pfnThreadProc中定义的函数参数所示。
nPriority 设定的线程的优先级。如果为0,则使用与创建它线程相同的优先级。
nStackSize 指定新线程使用的栈的以字节为单位的大小。如果为0,则缺省的栈大小与创建
它的线程的栈大小相同。
dwCreateFlags 指定控制线程的创建过程的附加标志。这个标志可以是两个值之一:
CREATE_SUSPENDED 经过一个延迟后启动这个线程。这个线程将在调
用ResumeThread 以后才会启动。
0 创建后立即启动这个线程。
lpSecurityAttrs 指向一个SECURITY_ATTRIBUTES结构,它指定了线程的安全特性。 如果为空,将使用与创建它的线程相同的安全特性。 1.创建工作者线程可用AfxBeginThread(pfnThreadProc,LPVOID pParam); 可以通过将指定的对话框指针通过pParam传递给工作线程控制函数,在函数内部可以强制类型转换到以前的类型使用;多个参数的话可以通过定义结构体进行参数传递。 2.创建用户界面线程 2.1 使用ClassWizard创建类CWinThread的派生类(以CUIThread类为例) 2.2 重载函数InitInstance()和ExitInstance()。 BOOL CUIThread::InitInstance() 2.3 创建新的用户界面线程 void CUIThreadDlg::OnButton1() 如果服务器具有一个可以在容器内现场激活的对象,并且这个容器是活动的,则这个函数返回一个指向包含这个现场活动文档的框架窗口对象的指针。 当启用用户界面线程后,在其中只得到了该线程的指针而并非主框架窗口的指针。 解决方法先用AfxGetApp得到程序的theApp指针在调用GetMainWnd得到指针才是主框架的指针。 CMainFrame* pMf = (CMainFrame*)AfxGetApp()->GetMainWnd(); CMainFrame* pMf = (CMainFrame*)AfxGetApp()->m_pMainWnd; 以上两个语句效果相同。
后记:AfxGetApp()可以在工程的任意地方得到其App指针,然后调用GetMainWnd()就可得到主框架的指针进行其他的操作。工作者线程中也可用AfxGetApp()->m_pMainWnd得到主框架指针,pParam就可用来传递其他参数了。 |
| |||||||