MFC中在主对话框创建了个线程,同时创建了个全局的互斥量,但是为什么我的线程中总是等不到互斥量呢?

简立强 2019-12-21 18:26:00

推荐回答

是的,算两个互斥量。mfc中本质上还是调用的createmutex函数来建立互斥对象的,这个函数会建立相应的互斥内核对象,并以名称命名,名称不一样,则代表两个互斥量对象。
边厚敏2019-12-21 18:41:01

提示您:回答为网友贡献,仅供参考。

其他回答

  • 创建互斥量在创建的时候就被加锁了吧。
    龚宇辉2019-12-21 18:57:10

相关问答

如果仅仅是充电电流过大,可以认为是当时蓄电池还未充足电引起,可是充电电压高达V,就可以认定为充电量过大故障。所以又进行了下一步的检测。按一般情况分析,充电量过大应该先怀疑电压调节器。所以先在怠速状态下测量调节器的各脚电压,分别是:电源V,励磁输出线V,搭铁脚.V。通过以上数据发现了疑点,蓄电池电压V,而调节器的电压为V,这是为什么呢?分析原车电路图,发现调节器的电源脚IG是通过以下途径给调节器供电的,即蓄电池正极→易熔线。点火开关。熔丝盒、调节器电源脚,还包括一些插接件。从总体来看,调节器与点火开关的其他控制对象是并联关系,如点火线圈、空调等,当车辆状况比较新时,因为导线和插接件的电阻都比较小,所以调节器的电源脚与蓄电池正极的压差不大,充电电压也基本正常。当车辆状况稍微老化之后,从蓄电池正极到调节器之间的这些小电阻互相串联,则会形成一个不可忽略的电阻,也因此会产生一个不正常的压降,这样传到调压器的电压就不是一个真实的充电电压,而对于调节器来说,这一引脚不但引入励磁输出的电源,而且是一个充电电压的取样端,所以这一不真实的取样电压也就影响到调节器的电压调节能力,本来在充电电压达.V以上时调节器就会节切断励磁电流,但在当前的故障状态下,交流发电机的输出电压达到V,而调节器的电压取样脚IG只收到了V的电压。这样也就必然不会切断励磁电流,也就会造成充电电压及电流都过高的现象。为了验证以上想法,接一粗导线到交流发电机的输出端与调节器的电源脚,并测量充电电流,发现充电电流在到A之间摆动,稍踩加速踏板,充电电流稳定在A左右,充电电压也稳定在.V,说明调节器还有低转速下充电电压不稳的问题,更换一个调节器后,在怠速状态下也可以保持稳定的充电,又在交流发电机输出端与调节器之间接一个继电器,让原来调节器的电源线当做继电器的控制线,这样交流发电机的输出电压便可以通过这一“专线”直接供给调节器的“电压取样”用,使之能够真实地检测充电电压。经过再次试车,效果良好。总结:在国产车中,充电系统的电压多受调节器控制,并与其他受控于点火开关的用电器并联,当车辆的用电量增加以及车辆情况老化之后都会影响到充电系统的稳定性,而作为全车供电的充电系统,必须保证.-.V的充电电压,否则,会使全车电器的工作状态受到影响。尤其是当充电电压过高时,危害就更大了。笔者还曾在金杯轻型客车也遇到过类似的故障。但像桑塔纳上是内装调节器式的交流发电机则可以避免这种故障出现,因为调节器装在发电机的内部,其电压取样直接在交流发电机的内部完成,导线长度很短,所以其电阻引起的压降可以忽略,还有的老式皇冠轿车上也直接利用双联调节器,其中一联当做一个继电器,从交流发电机的输出端引一个真实的充电电压供给调节器的电压线圈,以保证充电的稳定性。与以上两种车充电线路的设计相比,该车的设计是不合理的。综合以上分析,笔者以为对于采用类似充电线路的车辆都会发生这种故障,而采用加接继电器方式来维修此故障,是一种比较简单有效的方法,建议大家借鉴。有一个叫汽车维修大师的公众号,你可以关注一下,上面有好多你这种类似故障处理方法。
,很高兴为您解答。1:新建一个MFC的工程,单文档的工程。2:工程建好之后,可以先编译运行一下。下面就是要把View的窗口初始化为OpenGL的编程环境。当然以下所有的操作都是在View类中进行的。先在Project->Settings->Link中,加上opengl32.libglu32.libglut.libglaux.lib,然后在View.h的类定义中加上如下引用。include#include#include3:首先要让窗口支持OpenGL,那就必须要对PIXELFORMATDESCRIPTOR这个结构有所了解,先在View类中新建一个函数SetupPixFormatCDC*pDC,类型:看下面的函数就知道为BOOL,写下如下代码:void CTestGLInitialView::OnDestroy{CView::OnDestroy;// TODO: Add your message handler code hereHGLRC hrc = wglGetCurrentContext;wglMakeCurrentNULL, 0;wglDeleteContexthrc;delete m_pDC;}现在可以编译一下了,没有错误。7:现在,OpenGL的环境已经初始化差不多了。可以开始做图了,先定义一个作图的函数DrawScene,写上如下的代码:BOOL CTestGLInitialView::DrawScene{glClearGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;    // 清除屏幕和深度缓存glLoadIdentity;            // 重置当前的模型观察矩阵SwapBuffersm_pDC->GetSafeHdc;        // 交换缓冲区return TRUE;}然后,要在OnDraw中,调用这个函数:void CTestGLInitialView::OnDrawCDC* pDC{CTestGLInitialDoc* pDoc = GetDocument;ASSERT_VALIDpDoc;// TODO: add draw code for native data hereDrawScene;}8:运行一下,黑色的背景出来了。9:这时,可以修改DrawScene这个作图函数,作图。画出NeHe第3课的那个三角形和正方形来。写代码如下:BOOL CTestGLInitialView::DrawScene{glClearGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;    // 清除屏幕和深度缓存glLoadIdentity;            // 重置当前的模型观察矩阵glTranslatef-1.5f,0.0f,-6.0f;       // 左移 1.5 单位,并移入屏幕 6.0glBeginGL_TRIANGLES;         // 绘制三角形glColor3f1.0f, 0.0f, 0.0f;glVertex3f 0.0f, 1.0f, 0.0f;       // 上顶点glColor3f0.0f, 1.0f, 0.0f;glVertex3f-1.0f,-1.0f, 0.0f;       // 左下glColor3f0.0f, 0.0f, 1.0f;glVertex3f 1.0f,-1.0f, 0.0f;       // 右下glEnd;            // 三角形绘制结束glTranslatef3.0f,0.0f,0.0f;       // 右移3单位glColor3f0.0f, 0.0f, 1.0f;glBeginGL_QUADS;          // 绘制正方形glVertex3f-1.0f, 1.0f, 0.0f;       // 左上glVertex3f 1.0f, 1.0f, 0.0f;       // 右上glVertex3f 1.0f,-1.0f, 0.0f;       // 左下glVertex3f-1.0f,-1.0f, 0.0f;       // 右下   glEnd;SwapBuffersm_pDC->GetSafeHdc;        // 交换缓冲区return TRUE;}   运行一下,发现图形没有出现,这个怎么回事呢。原来是因为还没有定义投影方式和视口。即用正交投影还是透视投影。定义投影,还要捕获WM_SIZE消息。写如下代码:void CTestGLInitialView::OnSizeUINT nType, int cx, int cy{CView::OnSizenType, cx, cy;// TODO: Add your message handler code hereif 0 == cy         // 防止被零除{   cy = 1;          // 将Height设为1}glViewport0, 0, cx, cy;      // 重置当前的视口glMatrixModeGL_PROJECTION;     // 选择投影矩阵glLoadIdentity;        // 重置投影矩阵// 设置视口的大小gluPerspective45.0f,GLfloatcx/GLfloatcy,0.1f,100.0f;glMatrixModeGL_MODELVIEW;      // 选择模型观察矩阵   glLoadIdentity;        // 重置模型观察矩阵}   再运行一下,图形已经出来了。以后,就可以在DrawScene写任何画图的代码了,当窗口重绘的时候,都可以自动适应。如果要做一段可以运动的3D图画,可以再捕获WM_TIMER消息,通过在OnCreate的时候定义一个时钟,再配合一些变量,就可以做简单的动画了如若满意,请点击右侧希望我的回答对您有所帮助,!~ O∩_∩O~。