WEB开发网
开发学院软件开发VC 多线程编程之四——线程的同步 阅读

多线程编程之四——线程的同步

 2007-03-17 22:00:13 来源:WEB开发网   
核心提示: 下面给出一个简单实例来说明 CSemaphore 类的用法,例程10 MultiThread10建立一个基于对话框的工程MultiThread10,多线程编程之四——线程的同步(7),在对话框IDD_MULTITHREAD10_DIALOG中加入一个按钮和三个编辑框控件,按钮的ID为IDC

下面给出一个简单实例来说明 CSemaphore 类的用法。

例程10 MultiThread10

建立一个基于对话框的工程MultiThread10,在对话框IDD_MULTITHREAD10_DIALOG中加入一个按钮和三个编辑框控件,按钮的ID为IDC_START,标题为“同时写‘A’、‘B’、‘C’”;三个编辑框的ID分别为IDC_A、IDC_B和IDC_C,属性都选中Read-only;

在MultiThread10Dlg.h文件中声明两个线程函数:UINT WriteA(LPVOID pParam);
UINT WriteB(LPVOID pParam);
UINT WriteC(LPVOID pParam);

使用ClassWizard分别给IDC_A、IDC_B和IDC_C添加CEdit类变量m_ctrlA、m_ctrlB和m_ctrlC;

在MultiThread10Dlg.cpp文件中添加如下内容:

为了文件中能够正确使用同步类,在文件开头添加:

#include "afxmt.h"定义信号量对象和一个字符数组,为了能够在不同线程间使用,定义为全局变量:CSemaphore semaphoreWrite(2,2); //资源最多访问线程2个,当前可访问线程数2个
char g_Array[10];

添加三个线程函数:

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);
  for(int i=0;i<10;i++)
  {
    g_Array[i]=''C'';
    pEdit->SetWindowText(g_Array);
    Sleep(1000);
  }
  ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
  return 0;
}
这三个线程函数不再多说。在信号量对象有信号的状态下,线程执行到WaitForSingleObject语句处继续执行,同时可用线程数减1;若线程执行到WaitForSingleObject语句时信号量对象无信号,线程就在这里等待,直到信号量对象有信号线程才往下执行。

双击按钮IDC_START,添加其响应函数:void CMultiThread10Dlg::OnStart()
{
  CWinThread *pWriteA=AfxBeginThread(WriteA,
    &m_ctrlA,
    THREAD_PRIORITY_NORMAL,
    0,
    CREATE_SUSPENDED);
  pWriteA->ResumeThread();
  CWinThread *pWriteB=AfxBeginThread(WriteB,
    &m_ctrlB,
    THREAD_PRIORITY_NORMAL,
    0,
    CREATE_SUSPENDED);
  pWriteB->ResumeThread();
  CWinThread *pWriteC=AfxBeginThread(WriteC,
    &m_ctrlC,
    THREAD_PRIORITY_NORMAL,
    0,
    CREATE_SUSPENDED);
  pWriteC->ResumeThread();
  
}

好吧,多线程编程就介绍到这里,希望本文能对您有所帮助。

上一页  2 3 4 5 6 7 

Tags:线程 编程 线程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接