SetWindowText(str);//编辑框显示CSingleLocksinglelock(&mySemaphore);//创建CSingleLock类对象singlelock.Lock();//计数器初始值减1MessageBox(NULL,"信号量控制访问资源线程数","提示",MB_ICONWARNING);//弹出对话框thread--;//线程数目减1str.Format("%d",thread);pedit->SetWindowText(str);//编辑框显示return0;}-IMDN开发者社群-imdn.cn"> SetWindowText(str);//编辑框显示CSingleLocksinglelock(&mySemaphore);//创建CSingleLock类对象singlelock.Lock();//计数器初始值减1MessageBox(NULL,"信号量控制访问资源线程数","提示",MB_ICONWARNING);//弹出对话框thread--;//线程数目减1str.Format("%d",thread);pedit->SetWindowText(str);//编辑框显示return0;} - IMDN开发者社群-imdn.cn">
登录
首页 » VC++源码 » VC6.0 使用信号量Semaphore实现线程的同步

VC6.0 使用信号量Semaphore实现线程的同步

于 2022-02-20 发布 文件大小:13.88 kB
0 153
下载积分: 2 下载次数: 1

代码说明:

VC6.0 使用信号量Semaphore实现线程的同步,使用信号量实现线程同步,设置访问保护对象的最多线程数为2,确定当前已经启动运行的线程数目,可以创建线程。   CWinThread* pThread=AfxBeginThread(ThreadProc,&m_Edit);//开辟一个工作线程,   int thread=0;//全局变量记录当前运行线程的数目   CSemaphore mySemaphore(2,2);//创建CSemaphore类对象   UINT ThreadProc(LPVOID pParam)//工作线程入口函数   {    CEdit *pedit=(CEdit*)pParam;    CString str;    thread++;//线程数目加1    str.Format("%d",thread);    pedit->SetWindowText(str);//编辑框显示    CSingleLock singlelock(&mySemaphore);//创建CSingleLock类对象    singlelock.Lock();//计数器初始值减1    MessageBox(NULL,"信号量控制访问资源线程数","提示",MB_ICONWARNING);//弹出对话框    thread--;//线程数目减1    str.Format("%d",thread);    pedit->SetWindowText(str);//编辑框显示    return 0;   }

下载说明:请别用迅雷下载,失败请重下,重下不扣分!

发表评论

0 个回复

  • VC 重载打开文件对话框,添加删除按钮
    VC++ 重载打开文件对话框,添加删除按钮,实现思路:设置文件对话框的模板为IDD_MYFILEDLG,使用GetPathName();获取选中文件。打开文件对话框是这样实现的:   if( filedlg.DoModal ()==IDOK )//打开文件对话框    {    CString fileName = filedlg.GetFileTitle();    SetWindowText(fileName);    }   以上代码仅是参考,完整的代码文件请自行下载吧。
    2022-02-01 14:41:10下载
    积分:1
  • VC++ 6.0 使用IPicture读取显示多种格式的图像(图片)并缩放
    VC++ 6.0 使用IPicture显示多种格式的图片,并可进行图片的放大和缩小等缩放操作,本实例中从全局内存中,创建IStream,从图像文件创建IPicture对象,读文件数据到内存。支持的文件类型有:bmp;*.gif;*.jpg;*.ico;*.emf;*.wmf;获取图像的长度和宽度代码如下:   long hmWidth;   long hmHeight;   m_lPciture->get_Width(&hmWidth);//图像的长度   m_lPciture->get_Height(&hmHeight);//图像的宽度   SIZE sz;   sz.cx = hmWidth;   sz.cy = hmHeight;   pDC->HIMETRICtoDP (&sz);//从OLE对象尺寸转换为像素值   sz.cx = (sz.cx * m_nScale) / 100;   sz.cy = (sz.cy * m_nScale) / 100;   RECT rc;   GetClientRect(&rc);   SetScrollSizes(MM_TEXT, sz);//设置滚动窗口的尺寸   // 显示图像   m_lPciture->Render(pDC->m_hDC,    0, //水平坐标位置    0, //垂直坐标位置    sz.cx, //水平尺寸    sz.cy, //垂直尺寸    0, //源图像的水平偏移    hmHeight,//源图像的垂直偏移    hmWidth,//复制源图像的水平长度    -hmHeight,//复制源图像的垂直长度    &rc);//显示图像的矩形区域
    2022-07-21 07:14:46下载
    积分:1
  • VC++ 6.0 改变视图窗口的背景色
    VC++ 改变视图窗口的背景色,在窗口的显示区自定义颜色,有兴趣可参考以下代码:   void CFaceControl1View::OnChageviewbk() //改变背景色   {    m_rgbBack=RGB(0,128,128);    Invalidate(true);   }   BOOL CFaceControl1View::OnEraseBkgnd(CDC* pDC)   {    CBrush Brush (m_rgbBack);// 创建一个新的刷子    CBrush* pOldBrush = pDC->SelectObject (&Brush);// 把刷子选入设备环境    //获得需要檫除背景的区域    CRect reClip;    GetClientRect(&reClip);    //重绘该区域    pDC->PatBlt(reClip.left , reClip.top , reClip.Width () , reClip.Height() , PATCOPY);    //释放刷子    pDC->SelectObject (pOldBrush);    return TRUE;//必须返回TURE   }
    2022-08-04 05:28:13下载
    积分:1
  • 用VS2008+ATL开发可以显示Gif的ActiveX控件
    VS2008%2BATL开发Gif的ActiveX控件%28毛坯%29   创建一个空的解决方案,名称GifSolution。将来包含控件项目和测试项目。新建项目,弹出的对话框中选ATL项目,名称为GifAnimate确定。弹出的对话框中选择DLL服务器(可选允许合并代理存根,这样不会产生代理dll),完成后编译,这样工程框架就完成了。   组件分有窗口的和无窗口的,这里应该用有窗口的,所以添加组件的时候,外观不要基于none,最好基于CStatic。因为gif是动态的,应该用另一个线程绘制,这样不影响主线程响应消息,绘图更加流畅。   为GifAnimate项目添加类-选择ATL控件,点击添加,弹出对话框。   1.本文只是举例说明开发过程,抛砖而已。   2.样例只是框架,不能直接使用,所有代码没有经过测试   3.样例接收器GifSink和属性页卡片没有完成,懒了,呵呵   4.样例背景等很多属性没有实现   5.使用了GDI+,但GDI+的Image类的SetActiveFrame函数有问题,网上貌似没有解决办法。Debug版本不影响使用,Release版本没有测试。如果有兴趣,可以使用IPicture接口,网上很多。
    2022-03-31 20:14:24下载
    积分:1
  • VC++6.0实现ListCtrl列表控件拖放、整栏选择和显示网格
    VC++6.0实现列表控件的扩展风格——拖放、整栏选择和显示网格等功能,通过这个源代码你可以熟悉VC中的ListCtrl列表控件的多种用法,运行效果如示例截图所示,部分代码如下:   DWORD liststyle=m_ctlList.GetExtendedStyle();//获取列表控件的扩展风格m_ctlList.SetExtendedStyle(liststyle|LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//设置列表控件的新扩展风格   m_pImageList.Create(16, 16, ILC_COLOR, 2, 2);//创建图像列表   CBitmap bm;   bm.LoadBitmap(IDB_BITMAP1);//载入Bitmap资源   m_pImageList.Add(&bm, RGB(0, 0, 0));//添加到图像列表   bm.DeleteObject();   bm.LoadBitmap(IDB_BITMAP2);   m_pImageList.Add(&bm, RGB(0, 0, 0));   //初始化列表视   m_ctlList.SetImageList(&m_pImageList,LVSIL_SMALL);//设置ImageList   CString Field[2]={"性别","姓名"};//列表视的表头   for(int j=0;j
    2023-02-22 08:35:03下载
    积分:1
  • VC++ 6.0FreeBird软件 仿飞鸽传书,可聊天+传输文件
    VC++ 6.0自写的FreeBird仿飞鸽传书,可聊天+传输文件程序源码,我耗费一个月上百度、参考网上代码,和不断调试出来的一个网络文件传输小软件。可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。   做这个小软件的目的不是为了给别人使用,而是想通过开发这么一个小小和软件,体会软件设计的过程和了解网络通信是个大概什么样的东西(这也是我摸索了好久,现在才彻底明白原来Socket通信是这么一回事的)。总而言之:目的是为了学习。
    2023-08-31 14:20:03下载
    积分:1
  • VC++ 6.0 定制分割条(分隔条)的样式及大小
    VC++ 6.0 定制分割条,也就是窗体的分隔条,将窗口分隔成若干个部分,用来显示不同的内容,该窗格视图为CStaticSplitWnd4View,该窗格大小不能通过拖动改变,不过我们可以通过菜单命令动态改变大小,窗格视图为CView2,该窗格大小不能通过拖动改变,窗格视图CView3和CView4都可以通过分隔条的拖动来改变视图大校   本示例中的分隔条经过了初级的美化,而且也向用户展示了,如何通过分割条来固定分栏窗格视图的大小,如何让分隔条不支持拖动等功能。
    2023-08-22 18:20:04下载
    积分:1
  • VC++ 创建可以显示“最近打开”文件的功能
    VC++ 创建可以显示“最近打开”文件的功能,也就是为菜单项增添历史记录的功能,让打开的文件记录显示在菜单列表中,方便用户下一次打开文件,挺人性化的一个功能。现在的word、WPS等软件,打开后,用户都可以从菜单中选择最近打开的文件,快速找到自己的文档,本VC++源码就是模拟了这一功能。运行效果请参见下边的测试截图。
    2023-05-17 09:10:03下载
    积分:1
  • VC++三种直线扫描转换算法范例演示
    本源码演示了三种VC++直线扫描转换算法,这3种方式是:bresenham方法、数值微分法、中点画线法。本程序同时是一个MFC单文档程序,进行直线段扫面转换算法的算法验证。   1.使用Wizard建立单文档程序;   2.绘制20*20的网格线,格子X和Y方向间隔均为20像素,网格起始坐标在(20,20)。我们使用此网格模拟像素矩阵(),格子交叉点是像素中心。   3.输入直线段两端点,可使用以下两种方法之一:   a)对话框输入   b)鼠标在网格内以鼠标左键按下-拖动-抬起方式输入。注意:直线段两端点要自动取整到模拟的像素中心位置   4.进行直线段扫描转换,通过点击鼠标右键调用方式或者菜单调用的方式执行。计算完成后,将扫描转换结果,在模拟的像素矩阵中,使用圆形显示出来。   通过这个实验,我们可以熟悉扫描的算法,其中要注意的是判断直线的斜率,分情况处理竖直直线段、斜率绝对值大于1、斜率绝对值小于1的情况,这部分需要花费一些时间去算。总之还是对扫描算法的理解和编程基矗
    2022-03-19 09:46:38下载
    积分:1
  • VC++ DAO 操作Access的测试例子
    VC++ DAO 操作Access的测试例子,本演示是VC++使用DAO连接Access数据库的一个测试程序,学习如何使用DAO操作Access,通过添加一个数据库记录来演示添加、删除、插入数据的例子,比较简单,面向VC++初学者的一个例子。部分代码分享如下:   // 取得被选择记录的索引   nIndexInFieldList = m_listctrlInfo.GetNextSelectedItem(pos);   // 高亮被的选择记录   m_listctrlInfo.SetFocus();   // 从文件中把当前行记录删除   // 获取数据库文件   m_csDatebaseFile = GetDatabaseFile();   // 判断数据库是否已经打开   if (!m_bIsOpenDB)   {    db.Open(m_csDatebaseFile);    // 判断数据集是否已经打开    if (!m_bIsOpenDSN)    {    RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM PositionTable",NULL);    }   }   m_nTotal = m_listctrlInfo.GetItemCount();   m_nCurrentIndex = ConvertIndex(nIndexInFieldList,m_nTotal - 1);   RecSet.MoveFirst();   RecSet.Move(long(m_nCurrentIndex));   RecSet.Delete();   ClearContent();   // 删除被的选择记录   m_listctrlInfo.DeleteItem( nIndexInFieldList );   // 显示删除数据成功的信息   GetDlgItem(IDC_STATIC_INFO)->SetWindowText(_T("删除数据成功!"));   // 再次取得第一条记录的位置   POSITION pos = m_listctrlInfo.GetFirstSelectedItemPosition();   UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
    2022-04-28 15:09:11下载
    积分:1
  • 696518资源总数
  • 105885会员总数
  • 31今日下载