QQ登录

只需一步,快速开始

231上位机VC MFC打开与关闭程序chm帮助文本

[ 复制链接 ]

231上位机VC MFC使用信号量使多线程同步

231上位机VC MFC使用信号量使多线程同步
功能展示
当前使用使用信号量的方法使多个线程顺序向编辑框写入文本,实现多个线程间的同步功能,效果如图,点击按钮,三个线程按照先后顺序向编辑框写入字符;
要点提示
1.信号量的变量的创建可以用函数 CreateSemaphore()
函数原型:HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, LONGlInitialCount, LONGlMaximumCount,  LPCTSTRlpName);
lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了信号量的安全特性
lInitialCount Long,设置信号量的初始计数。可设置零到lMaximumCount之间的一个值
lMaximumCount Long,设置信号量的最大计数
lpName String,指定信号量对象的名称。用vbNullString可创建一个未命名的信号量对象。如果已经存在拥有这个名字的一个信号量,就直接打开现成的信号量。这个名字可能不与一个现有的互斥体、事件、可等待计时器或文件映射的名称相符
2.一旦不再需要,一定记住用CloseHandle关闭信号量的句柄。它的所有句柄都关闭以后,对象自己也会删除
一旦值大于零,信号量就会触发(发出信号)。ReleaseSemaphore函数的作用是增加信号量的计数。如果成功,就调用信号量上的一个等待函数来减少它的计数
实现功能
1.新建基于对话框的应用程序
2.拖拽一编程框ID为IDC_EDIT1,拖拽一按钮关联函数
  1. void CGkbc8Dlg::OnButton1()
  2. {        
  3.         g_hSema=CreateSemaphore(NULL,1,1,NULL);//初始化信号量
  4.         CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
  5.         pEdit->SetWindowText("使用信号量实现多线程同步:\r\n\r\n");
  6.         AfxBeginThread(ThreadFun1,pEdit);
  7.         AfxBeginThread(ThreadFun2,pEdit);
  8.         AfxBeginThread(ThreadFun3,pEdit);
  9. }
复制代码
3.在此函数前添加信号量变量及三个线程函数
  1. HANDLE g_hSema;
  2. static UINT ThreadFun1(LPVOID pParam)
  3. {
  4.         WaitForSingleObject(g_hSema,INFINITE);
  5.         CEdit*pEdit=(CEdit*)pParam;
  6.         CString sText;
  7.         for(int i=0;i<25;i++)
  8.         {
  9.                 pEdit->GetWindowText(sText);
  10.                 sText+="信";
  11.                 pEdit->SetWindowText(sText);
  12.                 Sleep(50);
  13.         }
  14.         pEdit->GetWindowText(sText);
  15.         sText+="\r\n\r\n";
  16.         pEdit->SetWindowText(sText);
  17.         ReleaseSemaphore(g_hSema,1,NULL);
  18.         return 0;
  19. }
复制代码
  1. static UINT ThreadFun2(LPVOID pParam)
  2. {
  3.         WaitForSingleObject(g_hSema,INFINITE);

  4.         CEdit*pEdit=(CEdit*)pParam;
  5.         CString sText;
  6.         for(int i=0;i<25;i++)
  7.         {
  8.                 pEdit->GetWindowText(sText);
  9.                 sText+="号";
  10.                 pEdit->SetWindowText(sText);
  11.                 Sleep(50);
  12.         }
  13.         pEdit->GetWindowText(sText);
  14.         sText+="\r\n\r\n";
  15.         pEdit->SetWindowText(sText);

  16.         ReleaseSemaphore(g_hSema,1,NULL);
  17.         return 0;
  18. }
  19. static UINT ThreadFun3(LPVOID pParam)
  20. {
  21.         WaitForSingleObject(g_hSema,INFINITE);

  22.         CEdit*pEdit=(CEdit*)pParam;
  23.         CString sText;
  24.         for(int i=0;i<25;i++)
  25.         {
  26.                 pEdit->GetWindowText(sText);
  27.                 sText+="量";
  28.                 pEdit->SetWindowText(sText);
  29.                 Sleep(50);
  30.         }
  31.         pEdit->GetWindowText(sText);
  32.         sText+="\r\n\r\n";
  33.         pEdit->SetWindowText(sText);
  34.         ReleaseSemaphore(g_hSema,1,NULL);
  35.         return 0;
  36. }
复制代码
在程序退出时关闭全局的信号变量
void CGkbc8Dlg::OnDestroy()
{
  CDialog::OnDestroy();
  CloseHandle(g_hSema);
}
我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:231.上位机VC MFC打开与关闭程序chm帮助文本.zip 
文件大小:162.71 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索