tjq_tang1:感谢贴主龚辉斌简单易懂的描述
(发表于2003-12-12 14:36:00)
不要只做技术:测试结果:不同步
我不知道是否理解了你的意思:当鼠标点击一下『确定』时再次弹出的对话框应该只比前一次每位都加一,比如说第一个对话框时000000000,那么第二个对话框就应该时111111111(个数没仔细数),但是我测试时,如果弹出第一个对话框后停留几秒再点『确定』的话,那再次弹出的对话框就不是111111111了。
要保正每次点击【确定】后无论等待多长时间再次弹出的对话框数据只比前一次加一的话应该做如下改正
再定义两个信号量
CSemaphore *m_pSemaphoreFull;
CSemaphore *m_pSemaphoreEmpty;
为指针分配空间
m_pSemaphoreFull = new CSemaphore(1,1);
m_pSemaphoreEmpty = new CSemaphore(0,1);
分别在SetData()和GetDataArray()
函数中加入
m_pSemaphoreFull->Lock();
//代码....
m_pSemaphoreEmpty->Unlock();
和
m_pSemaphoreEmpty->Lock();
//代码....
m_pSemaphoreFull->Unlock();
这样就能实现我理解的意思了。
Windows XP SP2 256M内存 CPU 2.4G 下测试通过
(发表于2005-3-9 14:34:00)
xw885:这个例子的确有问题,他的问题在对话框弹出的时机上,例子程序在堆上锁住线程的,一旦退出方法,锁就失效了,这时弹出对话框时,另一个线程就可以修改全局变量,造成数字跳跃增加,解决方法,将弹出对话框放到UnLock之前,因为MessageBox会阻塞当前线程,这样就不会UnLock,那么另一个线程就无法访问全局变量,问题就解决了
(发表于2005-3-14 19:50:00)
mahuixing:xw885说的对,MESSAGEBOX应该临界区的UNLOCK前,这个样子就可以在点击OK前锁住写。要将GetDataArray的UNLOCK删除,然后修改下面就可以实现互斥操作
UINT Thread_ReadProc(LPVOID param)
{
int aArray[10];
for (int i=0;i<20;i++)
{
DataArray.GetDataArray(aArray);
...
::MessageBox((HWND)param,str,"Thread Read Proc",MB_OK);
DataArray.CriticalSection.Unlock();
}
return 0;
}
(发表于2005-3-28 11:01:00)
cdq888:mahuixing 说的好,写的更好
只是
class CDataArray
{
private:
int iArray[10];
CCriticalSection CriticalSection;
public:
CDataArray(){};
~CDataArray(){};
void SetData(int iValue);
void GetDataArray(int aArray[10]);
};
要改为
class CDataArray
{
private:
int iArray[10];
public:
CDataArray(){};
~CDataArray(){};
CCriticalSection CriticalSection;
void SetData(int iValue);
void GetDataArray(int aArray[10]);
};
通过
谢谢 感谢贴主龚辉斌简单易懂的描述
和各们评论的人士... ...
(发表于2005-6-15 11:39:00)
..........................................................................
--------------------next---------------------