tempad
Readygo技术搜索引擎 >>ASP技术 >> VC中的同步机制,欢迎参与讨论------来者有分!

VC中的同步机制,欢迎参与讨论------来者有分!

Readygo技术搜索引擎 网络搜索 efish 2008-1-14 6:26:10

VC中的同步机制,欢迎参与讨论------来者有分!

楼主batizhou(batizhou)2002-05-14 15:02:06 在 VC/MFC / 基础类 提问

VC中有三种控制临界资源访问的方式:  
  1.CRITICAL_SECTION,   2.Mutex,   3.Semaphore;  
  但是前两者用于控制不同线程间的临界资源访问是有效的,对于同一线程则无效;  
  如在一个按钮的ON_CLICK函数下连写两个  
  EnterCriticalSection或WaitForSingleObject(hMutex)程序会继续运行,不会阻塞;  
  但Semaphore与前两者不同,如果连写两个WaitForSingleObject(hSemaphore),程序将会阻塞。  
   
  我的问题:  
  我先开一个线程,每0.1秒给主窗口发一个消息,主窗口有一个消息处理函数OnTestMsg  
  我用分别用以下三种方式测试能否控制对临界资源的访问  
  A.     EnterCriticalSection(&sec);  
          AfxMessageBox("--------");  
          LeaveCriticalSection(&sec);  
  B.     WaitForSingleObject(hMutex)  
          AfxMessageBox("--------");  
          ReleaseMutex(hMutex);  
  C.     WaitForSingleObject(hSemaphore);  
          AfxMessageBox("--------");  
          ReleaseSemaphore(hSemaphore,   1,   NULL);  
  CRITICAL_SECTION   sec;   HANDLE   hMutex;   HANDLE   hSemaphore为全局变量,并正确初始化  
  我想达到以下效果,任意时刻只有一个AfxMessageBox("-------")对话框出来,关闭一个再弹出下一个,但只有C能达到此效果  
  A和B都会不断的弹出窗口。  
  我不明白主窗口的消息函数是以何种方式执行的,我觉得不应该是线程方式,否则A和B就能达到我想要的效果,但如果不是以线程方式执行,为何这个函数能同时被执行多次,否则不会弹出多个AfxMessageBox,不知各位大侠有何高见?  
  问题点数:100、回复次数:11Top

1 楼tianlinyi(笨蛋)回复于 2002-05-14 15:30:52 得分 10

:)Top

2 楼dyw(旺仔)回复于 2002-05-14 15:38:08 得分 10

upTop

3 楼lms()回复于 2002-05-14 15:58:48 得分 20

AfxMessageBox内部有Message   Loop此时OnTestMsg会被继续调用,尽管此时是在AfxMessageBox   function内部,请注意到这一点  
  Top

4 楼akademecia(你不说我倒还明白,你越说我越糊涂)回复于 2002-05-14 16:23:53 得分 20

msdn的sample里有同步的例子,好像使用的Semaphore,结果与C方法相同。  
   
  Top

5 楼batizhou(batizhou)回复于 2002-05-14 16:44:13 得分 0

我知道会被继续调用OnTestMsg,我想知道它是以什么方式被调用的,是线程?普通函数调用?还是其他的方式?Top

6 楼zyoujie()回复于 2002-05-14 16:45:25 得分 10

我试试Top

7 楼southnan(就这么着)回复于 2002-05-14 16:52:09 得分 10

关注,学习。  
  我现在做都是用事件,可能使我自己学得还比较浅。Top

8 楼ShallonXu(总参谋长)回复于 2002-05-14 16:54:54 得分 10

UPTop

9 楼batizhou(batizhou)回复于 2002-05-14 16:57:23 得分 0

其实在用C方法时,弹出一个AfxMessageBox对话框后程序好像就死了,点什么都没有,不过用此方法确实可以实现对临界资源的访问控制,A和B则不能。Top

10 楼liuweiwei1()回复于 2002-05-14 17:05:56 得分 5

i   come,:)Top

11 楼qiuanhong(练从难处练,用从易处用)回复于 2002-05-14 17:26:32 得分 5

来啦  
  ^_^Top

责任编辑: efish 参与评论 查找更多:
相关文章
ado+sql server为何这么慢? ado+sql server为何这么慢?
如何对SYBASE数据库做日常备份,十万火急 如何对SYBASE数据库做日常备份,十万火急
从SQL SERVER里读数据到ACCESS里,但有3万多条,速度… 从SQL SERVER里读数据到ACCESS里,但有3万多条,速度太慢,怎么解决??
用什么工具能改变应用程序的图标?? 用什么工具能改变应用程序的图标??
如何在用无线网卡的CE环境下,用程序直接连SQL Serv… 如何在用无线网卡的CE环境下,用程序直接连SQL Server数据库啊?
请教打开access窗体时的条件语句、 请教打开access窗体时的条件语句、
鱼龙混杂的垃圾论坛!!!!!!!! 鱼龙混杂的垃圾论坛!!!!!!!!
请教,在delphi中使用SQL Server数据库,程序执行时… 请教,在delphi中使用SQL Server数据库,程序执行时沙漏如何消除?
Microsoft .NET 框架无法安装 Microsoft .NET 框架无法安装
如何动态引用DLL??? 如何动态引用DLL???
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎