博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC:多线程编程
阅读量:6200 次
发布时间:2019-06-21

本文共 6170 字,大约阅读时间需要 20 分钟。

一、创建工作者线程

1、创建一个基于对话框的应用程序。

2、在对话框上面添加一个按钮控件,其ID为ID_START,标题为“开始工作者线程”,再添加一个进度条控件,并利用类向导添加变量:CprogressCtrl m_progress;
3、在C*Dlg.cpp中添加结构体如下:
struct threadInfo
{
 int i;
 CProgressCtrl * pctrlProgress;
}Info;
4、编写一个函数fun(),实现进度条的步进.
UINT fun(LPVOID p)
{
 threadInfo * pInfo=(threadInfo *)p;
 for(int i=0;i<100;i++)
 {
  int nTemp=pInfo->i;
  pInfo->pctrlProgress->SetPos(i);
  Sleep(nTemp);
 }
 // pThread=AfxBeginThread(RUNTIME_CLASS(CMyThread));
 return 0;
}
5、添加函数创建工作者线程。
void CThreadDlg::OnStart()
{
 // TODO: Add your control notification handler code here
 Info.i=9;
 Info.pctrlProgress=&m_progress;
 pThread=AfxBeginThread(fun,&Info);//其他线程
}

 

二、创建用户界面线程

CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CMyThread));

 

三、CEvent事件顺序

1、

#include "afxmt.h"

CEvent event;

 

UINT write1(LPVOID pParam);

UINT write2(LPVOID pParam);

2、

void CTestDlg::OnStart()

{

       // TODO: Add your control notification handler code here

       CWinThread *pwrite1=AfxBeginThread(write1,

              &m_pro1,

              THREAD_PRIORITY_NORMAL,

              0,

              CREATE_SUSPENDED);

       pwrite1->ResumeThread();   

 

       CWinThread *pwrite2=AfxBeginThread(write2,

              &m_pro2,

              THREAD_PRIORITY_NORMAL,

              0,

              CREATE_SUSPENDED);

       pwrite2->ResumeThread();   

}

 

 

 

UINT write1(LPVOID pParam)

{

 

       CProgressCtrl *p=(CProgressCtrl*)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

       event.SetEvent();

       return 0;

}

UINT write2(LPVOID pParam)

{

       WaitForSingleObject(event.m_hObject,INFINITE);//注释后,同时出现

       CProgressCtrl *p=(CProgressCtrl*)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

       return 0;

}

 

四、线程的通信与同步

 

注意:包含头文件:#include"afxmt.h",将CSemaphore类添加进来。

 

1、创建对话框

2、添加4个进度条控件,一个按钮,并添加相应的变量。

3、在*Dlg.cpp中添加全局变量。

CCriticalSection section;//临界区对象

CSemaphore semaphore(2,2);//最多2,初始化2;

CEvent event;//事件对象

4、添加5个线程函数:

 

UINT write1(LPVOID pParam);

UINT write2(LPVOID pParam);

UINT write3(LPVOID pParam);

UINT write4(LPVOID pParam);

UINT write5(LPVOID pParam);

 

void CMyDialog::OnStart()

{

       // TODO: Add your control notification handler code here

       CWinThread * pWrite1=AfxBeginThread(write1,&m_pro1,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite1->ResumeThread();

       CWinThread * pWrite2=AfxBeginThread(write2,&m_pro2,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite2->ResumeThread();

       CWinThread * pWrite3=AfxBeginThread(write3,&m_pro3,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite3->ResumeThread();

       CWinThread * pWrite4=AfxBeginThread(write4,&m_pro4,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite4->ResumeThread();

       CWinThread * pWrite5=AfxBeginThread(write5,&m_pro1,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite5->ResumeThread();

}

 

 

UINT write1(LPVOID pParam)

{

       WaitForSingleObject(semaphore.m_hObject,INFINITE);

       CProgressCtrl *p=(CProgressCtrl *)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

       ReleaseSemaphore(semaphore.m_hObject,1,NULL);

       return 0;

}

UINT write2(LPVOID pParam)

{

       WaitForSingleObject(semaphore.m_hObject,INFINITE);

       CProgressCtrl *p=(CProgressCtrl *)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

       ReleaseSemaphore(semaphore.m_hObject,1,NULL);

       return 0;

}

UINT write3(LPVOID pParam)

{

//     WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);

       WaitForSingleObject(semaphore.m_hObject,INFINITE);

       section.Lock();

       CProgressCtrl *p=(CProgressCtrl *)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

       section.Unlock();

       ReleaseSemaphore(semaphore.m_hObject,1,NULL);

       return 0;

}

UINT write4(LPVOID pParam)

{

       WaitForSingleObject(semaphore.m_hObject,INFINITE);

       section.Lock();

       CProgressCtrl *p=(CProgressCtrl *)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

       section.Unlock();

       ReleaseSemaphore(semaphore.m_hObject,1,NULL);

       event.SetEvent();

       return 0;

}

UINT write5(LPVOID pParam)

{

       WaitForSingleObject(event.m_hObject,INFINITE);

       CProgressCtrl *p=(CProgressCtrl *)pParam;

       for(int i=0;i<100;i++)

       {

              p->SetPos(i);

              Sleep(100);

       }

//     ReleaseSmaphore(semaphore.m_hObject,1,NULL);

       return 0;

}

5、创建工作者线程:

void CMyDialog::OnStart()

{

       // TODO: Add your control notification handler code here

       CWinThread * pWrite1=AfxBeginThread(write1,&m_pro1,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite1->ResumeThread();

       CWinThread * pWrite2=AfxBeginThread(write2,&m_pro2,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite2->ResumeThread();

       CWinThread * pWrite3=AfxBeginThread(write3,&m_pro3,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite3->ResumeThread();

       CWinThread * pWrite4=AfxBeginThread(write4,&m_pro4,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite4->ResumeThread();

       CWinThread * pWrite5=AfxBeginThread(write5,&m_pro1,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWrite5->ResumeThread();

}

五、线程的同步

注意:包含头文件:#include"afxmt.h",将CSemaphore类添加进来。

 

1、创建对话框

2、添加3个编辑框,一个按钮,并添加相应的变量。

3、在*Dlg.cpp中添加全局变量。

CSemaphore semaphoreWrite(3,3);//信号量对象 初始化3,最大个数3;

char g_Array[10];//字符数组

4、添加3个函数:

//添加3个函数:

UINT WriteA(LPVOID pParam)

{

       CEdit * pEdit=(CEdit *)pParam;

       pEdit->SetWindowText("");

       WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);

       CString str;

       for(int i=0;i<10;i++)

       {

              pEdit->GetWindowText(str);

              g_Array[i]='A';

              str=str+g_Array[i];

              pEdit->SetWindowText(str);

              Sleep(1000);

       }

       ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);//释放信号量

       return 0;

}

UINT WriteB(LPVOID pParam)

{

       CEdit * pEdit=(CEdit *)pParam;

       pEdit->SetWindowText("");

       WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);

       CString str;

       for(int i=0;i<10;i++)

       {

              pEdit->GetWindowText(str);

              g_Array[i]='B';

              str=str+g_Array[i];

              pEdit->SetWindowText(str);

              Sleep(1000);

       }

       ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);//释放信号量

       return 0;

}

UINT WriteC(LPVOID pParam)

{

       CEdit * pEdit=(CEdit *)pParam;

       pEdit->SetWindowText("");

       WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);

       CString str;

       for(int i=0;i<10;i++)

       {

              pEdit->GetWindowText(str);

              g_Array[i]='C';

              str=str+g_Array[i];

              pEdit->SetWindowText(str);

              Sleep(1000);

       }

       ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);//释放信号量

       return 0;

}

5、创建同步线程进行输出:

       CWinThread * pWriteA=AfxBeginThread(WriteA,&m_A,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWriteA->ResumeThread();

 

       CWinThread * pWriteB=AfxBeginThread(WriteB,&m_B,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWriteB->ResumeThread();//结束线程

 

       CWinThread * pWriteC=AfxBeginThread(WriteC,&m_C,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

       pWriteC->ResumeThread();

 

转载地址:http://wgvca.baihongyu.com/

你可能感兴趣的文章
前端进阶之什么是BFC?BFC的原理是什么?如何创建BFC?
查看>>
浅聊HTTP缓存 (HTTP Cache)
查看>>
MarkDown 常用语法
查看>>
Android中使用Handler为何造成内存泄漏?
查看>>
MUI使用个推推送流程分析
查看>>
又有MVP新写法了,这次我认为挺不错的。
查看>>
使用promise来实现async
查看>>
ThreadLocal的hash算法(关于 0x61c88647)
查看>>
CGLIB 普通用法
查看>>
基于 webpack4 搭建 vue2、vuex 多页应用框架
查看>>
-卡牌+动态信息长按保存图片注意点~
查看>>
Git 安装(window)
查看>>
GMTC 大前端时代前端监控的最佳实践
查看>>
Fastlane - 利用Fastfile脚本打包
查看>>
Flutter 动画曲线 Curves
查看>>
koa2实现session-cookie和token的鉴权
查看>>
elasticsearch集群搭建和javaApi的使用
查看>>
springmvc + mybatis 构建cms内容发布系统
查看>>
当面试官问我JDK Semaphore的原理时,我笑了
查看>>
小白学JMeter:如何开始简单的WEB压力测试(二)
查看>>