vc多线程编程

来源:互联网 发布:王牌对王牌网络直播 编辑:程序博客网 时间:2024/04/30 10:59
vc多线程编程

一,创建终止线程
有三种方式
1,创建AfxBeginThread()
终止AfxEndThread()
2,创建CreateThread()
终止ExitThread()
3,创建_beginthread()
终止_endthread()
创建_beginthreadex()
终止_endthreadex()

外部线程终止线程用TerminateThread()


二,vc中线程间通信

线程间通信可以使用(1)全局变量(2)自定义消息(3)
这里主要讲解自定义消息

1,声明自定义消息

#define NODEEXIT_MESSAGE (WM_USER + 100)    //节点退出消息
#define PAINT_MESSAGE    (WM_USER + 101)            //绘图消息
#define  WM_WEB_MESSAGE (WM_USER+102)        //WebServer消息
#define  READDATA_MESSAGE (WM_USER+103)        //扩展板串口读数消息

2,声明消息响应函数

afx_msg LRESULT OnNodeExitEvent(WPARAM wParam, LPARAM lParam);  //节点退出事件处理
afx_msg LRESULT OnPaintEvent(WPARAM wParam, LPARAM lParam);//画图事件处理
afx_msg LRESULT OnWebEvent(WPARAM wParam, LPARAM lParam);//WebServer事件处理
afx_msg LRESULT OnReadDataEvent(WPARAM wParam, LPARAM lParam);        //读数据事件

3,建立消息连接

BEGIN_MESSAGE_MAP(CWSNDemoDlg, CDialog)

ON_MESSAGE(NODEEXIT_MESSAGE, OnNodeExitEvent)
ON_MESSAGE(PAINT_MESSAGE, OnPaintEvent)
ON_MESSAGE(WM_WEB_MESSAGE, OnWebEvent)
ON_MESSAGE(READDATA_MESSAGE, OnReadDataEvent)

END_MESSAGE_MAP()

4,编写消息响应函数
//画图事件
LRESULT CWSNDemoDlg::OnPaintEvent( WPARAM wParam, LPARAM lParam)
{
    float f_float;
    memcpy(&f_float,&lParam,sizeof(lParam));
    m_Graph.AppendPoint(f_float);
    return  0;
}
。。。

这样就建立好了消息机制,
在发送消息的地方可以用PostMessage来发送消息了:
PostMessage(m_hWnd,PAINT_MESSAGE,0,0);


三,线程同步
1,使用临界区
CRITICAL_SECTION m_csReceiveBuffer;//临界区
InitializeCriticalSection(&m_csReceiveBuffer);
EnterCriticalSection(&m_csReceiveBuffer);
LeaveCriticalSection(&m_csReceiveBuffer);

2,使用互斥对象
(1)声明互斥对象
HANDLE m_hMutex;
(2)建立互斥对象
hMutex = CreateMutex(NULL, FALSE, NULL);
(3)等待互斥对象
WaitForSingleObject(hMutex, INFINITE);
(4)释放互斥对象
ReleaseMutex(hMutex);

3,使用信号量
(1)声明信号量对象
HANDLE m_hSemaphore;
(2)建立信号量对象
hSemaphore = CreateSemaphore(NULL, 3, 5, NULL);
(3)等待信号量对象
WaitForSingleObject(hSemaphore, INFINITE);
(4)释放信号量对象
ReleaseSemaphore(hSemaphore, 1, NULL);


4,使用事件对象
(1)声明事件对象
HANDLE hEvent;
(2)创建事件对象
hEvent = CreateEvent(hEvent, INFINITE);
(3)等待事件对象
WaitForSingleObject(hEvent, INFINITE);
(4)设置事件为有信号
SetEvent(hEvent);

线程同步的四种方法各有特点,使用的简单规则为:
(1)如果某个操作必须等待另一个操作完成,那么考虑使用事件对象。
(2)同一时刻,同一应用程序内指定个数的相处要访问同一个资源,可以使用信号量对象。
(3)同时访问同一个资源的应用程序多于一个,应该使用互斥对象。否则,使用临界区。