界面线程

2009年07月05日 20:51
1. 建立一个基于对话框的工程MultiThread6,在对话框IDD_MULTITHREAD6_DIALOG中加入一个按钮IDC_UI_THREAD,标题为“用户界面线程”

  2. 右击工程并选中“New Class…”为工程添加基类为CWinThread派生线程类CUIThread。

  3. 给工程添加新对话框IDD_UITHREADDLG,标题为“线程对话框”。

  4. 为对话框IDD_UITHREADDLG创建一个基于CDialog的类CUIThreadDlg。使用ClassWizard为CUIThreadDlg类添加WM_LBUTTONDOWN消息的处理函数OnLButtonDown,如下:

void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point)
...
{
     AfxMessageBox(
"You Clicked The Left Button!"
);
     CDialog::OnLButtonDown(nFlags, point);
}


  5. 在UIThread.h中添加 #include "UIThreadDlg.h"

  并在CUIThread类中添加protected变量CUIThread m_dlg:

class CUIThread : public CWinThread
...
{
     DECLARE_DYNCREATE(CUIThread)
protected
:
     CUIThread();           
//
protected constructor used by dynamic creation
    
// Attributes

public:
    
// Operations

public:
    
//
Overrides
    
//
ClassWizard generated virtual function overrides
    
//{{AFX_VIRTUAL(CUIThread)

public:
    
virtual
BOOL InitInstance();
    
virtual int
ExitInstance();
    
//
}}AFX_VIRTUAL
    
// Implementation

protected:
     CUIThreadDlg m_dlg;
    
virtual ~
CUIThread();
    
//
Generated message map functions
    
//
{{AFX_MSG(CUIThread)
    
//
NOTE - the ClassWizard will add and remove member functions here.
    
//}}AFX_MSG

     DECLARE_MESSAGE_MAP()
}
;


6. 分别重载InitInstance()函数和ExitInstance()函数:

BOOL CUIThread::InitInstance()
...
{
     m_dlg.Create(IDD_UITHREADDLG);
     m_dlg.ShowWindow(SW_SHOW);
     m_pMainWnd
=&
m_dlg;
    
return
TRUE;
}

int CUIThread::ExitInstance()
...
{
     m_dlg.DestroyWindow();
    
return
CWinThread::ExitInstance();
}


7. 双击按钮IDC_UI_THREAD,添加消息响应函数:

void CMultiThread6Dlg::OnUiThread()
...
{
     CWinThread
*pThread=
AfxBeginThread(RUNTIME_CLASS(CUIThread));
}


  并在MultiThread6Dlg.cpp的开头添加:

#include "UIThread.h"


  好了,编译并运行程序吧。每单击一次“用户界面线程”按钮,都会弹出一个线程对话框,在任何一个线程对话框内按下鼠标左键,都会弹出一个消息框。

七、线程间通讯

  一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。  

  1、使用全局变量进行通信  

  由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传递指向该结构的指针进行传递信息。  

  2、使用自定义消息  

  我们可以在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。一个线程向另外一个线程发送消息是通过操作系统实现的。利用Windows操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到该消息,然后把该消息转发给目标线程,接收消息的线程必须已经建立了消息循环。   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值