加载中…
个人资料
jackeagle
jackeagle
  • 博客等级:
  • 博客积分:0
  • 博客访问:9,405
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

09-CQueue windows核心编程 例题 信号量和互斥量的使用

(2013-10-16 22:47:11)
标签:

windows核心编程

信号量和互斥量的使用

it

分类: windows核心编程


对于这个案例,我想我们还是按原来的方式
将这个案例进行分解:
怎么分解呢?好啦,现在就开始:
1.首先,必须做的事是,你要先把界面设计好,否则一切免谈;假设现在你的界面已经设计好啦,
为了方便点,狼影我就偷点懒,直接把作者的界面拉倒我的项目中啦^_^
2.接下来我们要做的是要先把界面显示出来...
3.设计类,记住在这的类虽然和8章的那个类同名并且都是对队列的封装,但他们是不同的,
 不同处在于在这的队列用到了互斥量和一个信号量对一个队列中的元素进行控制,,在这我们将看到
 如何使队列具有线程安全性
 这个类的实现请看我发表过得一篇博文安全CQueue
 地址 http://blog.sina.com.cn/s/blog_c2ef450f0101918v.html
4.接下来就简单啦,创建客户线程和服务线程,然后实现客户线程往队列中加内容,而服务线程对
  队列中的元素进行处理,然后使数据出数列
5.别忘了尾巴处理,将内核句柄全部关闭

#include "Queue.h"
#include "resource.h"
#include "process.h"
#include "windowsx.h"
#include "strsafe.h"

////////////////////////////////////全局变量////////////////////////
CQueue g_q(10); //初始时队列中有十个元素
HWND g_hwndDlg;//保存对话框句柄
//#define MAXIMUM_WAIT_OBJECTS 64
HANDLE g_hThreads[MAXIMUM_WAIT_OBJECTS];//存放线程句柄
int g_ThreadNum; //线程的数量
volatile LONG g_bShutdown = FALSE;
///////////////////////////////////////////////////////////

typedef unsigned (__stdcall *LPFN_FUN)(void *);


////////////////////////////////////////////////////////////函数声明
DWORD WINAPI ClientThread(LPVOID lParam);
DWORD WINAPI ServeThread(LPVOID lParam);
BOOL WINAPI MyDialogProc(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam);
////////////////////////////////////////////////////////////////////////////////////
int WINAPI  WinMain(HINSTANCE hInstance,HINSTANCE,
        LPSTR lpCmdLine,int nShowCmd)
{
 //显示对话框
 DialogBox(hInstance,MAKEINTRESOURCE(IDD_QUEUE),NULL,MyDialogProc);

 //对尾巴进行清理
 InterlockedExchange(&g_bShutdown,TRUE); //停止所有线程的工作

 //等待所有的线程执行完毕
 WaitForMultipleObjects(g_ThreadNum,g_hThreads,TRUE,INFINITE);

 //关闭内核对象的句柄
 for(int i= 0; i
 {
  CloseHandle(g_hThreads[i]);
 }

 return 0;
}

BOOL WINAPI MyDialogProc(HWND hwndDlg,UINT message, WPARAM wParam, LPARAM lParam)
{
 switch(message)
 {
 case WM_INITDIALOG://初始化对话框
  {
   //当然作者在这添加了一个图标,我想这么简单的问题大家
   //应该都会把,所以请容许狼影在这省略之

   //我们直接看线程的创建
   //首先创建客户线程
   int i = 0;
   for(;i<4; i++)
    g_hThreads[g_ThreadNum++]=(HANDLE)_beginthreadex(NULL,0,(LPFN_FUN)ClientThread,
                (void*)i,0,NULL);
   //创建两个服务线程
   for(i=0; i<2; i++)
    g_hThreads[g_ThreadNum++] =(HANDLE) _beginthreadex(NULL,0,(LPFN_FUN)ServeThread,
       (void*)i,0,NULL);
   g_hwndDlg = hwndDlg;
   return TRUE;
  }
 case WM_COMMAND:
  {
   switch(LOWORD(wParam))
   {
   case IDCANCEL:
    ::EndDialog(hwndDlg,0);//结束对话框
    return TRUE;
   }
   break;
  }
 }
 return FALSE;
}

///////////////////////////////////////函数实现///////////////////////////////
//客户线程函数
DWORD WINAPI ClientThread(LPVOID lParam)
{
 ULONG nThreadNum = (ULONG)(ULONG_PTR)lParam;

 ULONG nRecondNum = 0;

 while((PVOID)1!=::InterlockedCompareExchangePointer((PVOID*)&g_bShutdown,(PVOID)0,(PVOID)0))
 {
  CQueue::ELEMENTS e;
  e.nRecordNum = ++nRecondNum;
  e.nThreadNum = nThreadNum;

  TCHAR szBuffer[1024];

  if(g_q.Append(&e,200))
  {
   StringCchPrintf(szBuffer,_countof(szBuffer),TEXT("sending[%d]:[%d]"),
          nThreadNum,nRecondNum);
  }
  else
  {
   StringCchPrintf(szBuffer,_countof(szBuffer),TEXT("sending[%d]:[%d] %s"),nThreadNum,
    nRecondNum,(GetLastError()==ERROR_TIMEOUT)?TEXT("timeout"):TEXT("full"));
  }

  //获得列表框的句柄
  HWND hwndList = ::GetDlgItem(g_hwndDlg,IDC_CLIENTS);
  ListBox_SetCurSel(hwndList,ListBox_AddString(hwndList,szBuffer));
  
  ::Sleep(2000); //等待2000毫秒
 }
 return 0;
}

//服务线程函数
DWORD WINAPI ServeThread(LPVOID lParam)
{
 ULONG nThreadNum = (ULONG)(ULONG_PTR)lParam;

 while((PVOID)1!=::InterlockedCompareExchangePointer((PVOID*)&g_bShutdown,(PVOID)0,(PVOID)0))
 {
  TCHAR szBuffer[256];
  CQueue::ELEMENTS e;

  if(g_q.Remove(&e,5000))
  {
   StringCchPrintf(szBuffer,_countof(szBuffer),TEXT("[%d]processing[%d]:[%d]"),
    nThreadNum,e.nThreadNum,e.nRecordNum);
  }
  else
  {
   StringCchPrintf(szBuffer,_countof(szBuffer),
        TEXT("[%d]processing timeout"),nThreadNum);
  }

  HWND hwndList = ::GetDlgItem(g_hwndDlg,IDC_SERVERS);
  ListBox_SetCurSel(hwndList,ListBox_AddString(hwndList,szBuffer));

  ::Sleep(2500);
 }
 return 0;
}

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
前一篇:安全CQueue
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇安全CQueue
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有