VC学习笔记10多线程

来源:互联网 发布:win10 python环境搭建 编辑:程序博客网 时间:2024/06/05 20:47
现在开始多线程编成
在创建新的线程后,新线程的程序是和主线程程序并行执行的
创建一个MFC程序,这里我创建了一个EDIT变量m_edit
并在对话框类CXctestDlg中定义线程的句柄
HANDLE m_hThread;
在所需调用创建线程处加入
m_hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
然后定义线程处理函数ThreadProc:
DWORD __stdcall ThreadProc(LPVOID lp)  //这个参数的类型唯一
{
    CXctestDlg *dlg=(CXctestDlg*)lp;
    CString str;
    for(int i=0;i<999999;i++)
    {
        str.Format("%d",i);
        dlg->m_edit.SetWindowText(str);
        dlg->m_edit.Invalidate();
    }
    return 0;
}
这个程序的功能是当按下按钮,遍及框的数字自动显示增加,当然这不会影响主对话框的操作,因为他们在不同的线程并行执行。
下面看看CreateThread各个参数:
CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,  //表示线程对象的安全属性,一般为NULL
    DWORD dwStackSize,  //线程栈空间的大小,如果输入为0则为默认大小1MB
    LPTHREAD_START_ROUTINE lpStartAddress,  //线程执行函数地址,多线程可以用同一个地址
    LPVOID lpParameter,  //参数传给线程函数的参数
    DWORD dwCreationFlags,  //指定额外的标志来控制线程的创建,为0表示线程创建后立即调度
    LPDWORD lpThreadId  //返回线程ID号,为NULL不需要返回
 );
挂起线程:
SuspendThread(m_hThread);  //暂停的作用
唤醒线程:
ResumeThread(m_hThread);  //解除暂停作用
强迫中止线程:
TerminateThread(m_hThread);

线程同步
当多线程一起操作一个全局变量时会产生冲突,因此需要线程同步

事件驱动同步:
定义一个全局变量
HANDLE hEvent;  //事件句柄
分别在每一个线程中加入
WaitForSingleObject(hEvent.INFINITE);
...  //操作
SetEvent(hEvent);
在线程创建部分加入
hEvent=CreateEvent(NULL,FALSE,TRUE,"event");
效果:
每个线程只能在hEvent被设置后才会调用
当hEvent未被设置,WaitForSingleObject(hEvent.INFINITE)这句就是
等待直到hEvent被设置,一旦hEvent被设置,这个函数才会结束,函数
结束时自动将hEvent改为未设置,然后执行下面的程序,后面SetEvent(hEvent)
就是重新设置hEvent。



下面介绍另一种方法
在对话框类中加入
CWinThread *m_pThread;
在所需要响应线程的按钮中加入
m_pThread=AfxBeginThread(ThreadFun,this,0,0,0,NULL);
线程处理函数
UINT ThreadFun(LPVOID pTh)
{
  ...return 0;
}
在所需要结束线程的地方,这边我有一个按钮强制结束,响应代码如下
DWORD dwexit=0;
if(m_pThread!=NULL)  //如果线程已经结束那么就是NULL了
{
  GetExitCodeThread(m_pThread,&dwexit);  //把线程的运行状态给dwexit
    if(dwexit==STILL_ACTIVE)
        TerminateThread(m_pThread,0);  //强制终止
    delete m_pThread;
}










0 0