现在有3个线程,需要进行同步处理,现在不知道用的CEvent,还是通过对线程的挂起和恢复来实现,那种要好一些.
如下:
用CEvent;
CEvent event1(FALSE,FALSE,NULL,NULL); //自动事件
CEvent event2(FALSE,TRUE,NULL,NULL); //手动事件
//发送线程
UINT thread1(LPVOID lParam)
{
DWORD iRet;
while(1)
{
//发送数据完成后,就开启接收线程,等待数据接收
/....../
event2.SetEvent();//开启接收线程
//如果100ms没有收到应该收到的数据,就不在等待.
iRet = WaitForSingleObject(event1, 100);
switch()
{
case WAIT_TIMEOUT:
event2.ResetEvent();//接收超时,挂起接收线程,
//这里用thread2->suspendThread(),来代替好不
break;
default:
break;
}
sleep(10);
}
}
//接收线程,查询读取数据
UINT thread2(LPVOID lParam)
{
while(1)
{
WaitForSingleObject(event2, INIFINTE);
//读取数据,如果在100ms里读取到50个数据,就自动停止
count += readdata();
if(count == 50)
{ PostMessage();//给主线程显示接收正确的数据
event2.ResetEvent();
event1.SetEvent();
}
}
}
//主线程,界面显示数据等等.
UINT thread3(LPVOID lParam)
{
}用挂起和恢复线程实现
//发送线程
UINT thread1(LPVOID lParam)
{
DWORD iRet;
while(1)
{
//发送数据完成后,就开启接收线程,等待数据接收
/....../
//开启接收线程
while(thread2->ResumeThread() == 0xFFFFFFFF){}
//如果100ms没有收到应该收到的数据,就不在等待.
iRet = WaitForSingleObject(event1, 100);
switch()
{
case WAIT_TIMEOUT:
//接收超时,挂起接收线程,
while(thread2->suspendThread() == 0xFFFFFFFF){}
break;
default:
break;
}
sleep(10);
}
}
//接收线程,查询读取数据
线程创建是就是挂起状态
UINT thread2(LPVOID lParam)
{
while(1)
{
//读取数据,如果在100ms里读取到50个数据,就自动停止
count += readdata();
if(count == 50)
{
PostMessage();//给主线程显示接收正确的数据
while(thread2->suspendThread() == 0xFFFFFFFF){}
event1.SetEvent();
}
}
}请问各位大侠还有什么好的方法吗?小弟在此谢了
如下:
用CEvent;
CEvent event1(FALSE,FALSE,NULL,NULL); //自动事件
CEvent event2(FALSE,TRUE,NULL,NULL); //手动事件
//发送线程
UINT thread1(LPVOID lParam)
{
DWORD iRet;
while(1)
{
//发送数据完成后,就开启接收线程,等待数据接收
/....../
event2.SetEvent();//开启接收线程
//如果100ms没有收到应该收到的数据,就不在等待.
iRet = WaitForSingleObject(event1, 100);
switch()
{
case WAIT_TIMEOUT:
event2.ResetEvent();//接收超时,挂起接收线程,
//这里用thread2->suspendThread(),来代替好不
break;
default:
break;
}
sleep(10);
}
}
//接收线程,查询读取数据
UINT thread2(LPVOID lParam)
{
while(1)
{
WaitForSingleObject(event2, INIFINTE);
//读取数据,如果在100ms里读取到50个数据,就自动停止
count += readdata();
if(count == 50)
{ PostMessage();//给主线程显示接收正确的数据
event2.ResetEvent();
event1.SetEvent();
}
}
}
//主线程,界面显示数据等等.
UINT thread3(LPVOID lParam)
{
}用挂起和恢复线程实现
//发送线程
UINT thread1(LPVOID lParam)
{
DWORD iRet;
while(1)
{
//发送数据完成后,就开启接收线程,等待数据接收
/....../
//开启接收线程
while(thread2->ResumeThread() == 0xFFFFFFFF){}
//如果100ms没有收到应该收到的数据,就不在等待.
iRet = WaitForSingleObject(event1, 100);
switch()
{
case WAIT_TIMEOUT:
//接收超时,挂起接收线程,
while(thread2->suspendThread() == 0xFFFFFFFF){}
break;
default:
break;
}
sleep(10);
}
}
//接收线程,查询读取数据
线程创建是就是挂起状态
UINT thread2(LPVOID lParam)
{
while(1)
{
//读取数据,如果在100ms里读取到50个数据,就自动停止
count += readdata();
if(count == 50)
{
PostMessage();//给主线程显示接收正确的数据
while(thread2->suspendThread() == 0xFFFFFFFF){}
event1.SetEvent();
}
}
}请问各位大侠还有什么好的方法吗?小弟在此谢了
解决方案 »
- heap corruption detected
- p2p视频点播,VC++实现,需要什么技术?
- 有没有像方向盘和仪表盘的控件?
- 我第一个MFC程序就出错了,请高手指点
- 使用ADO如何高效地插入成批数据
- 获得ListCtrl中的所有子项的数据,怎么实现?
- 下面directshow播放.avi文件代码//还缺什么能把.avi文件在对话框上显示呀?
- 数据库编程,入门级的.
- 变量中 ($con) 存放了在脚本中供稍后使用的连接。如果连接失败,将执行 "die"
- 好像有一篇介绍FAT的文章,谁有给我?100分![email protected]
- 请问左边一条可以切换视图的导航栏是怎么做的????
- 请问 MSXML4 解析xml文档,load()总是返回-1,是为什么?
..............
..代码........
..............
LeaveCriticalSection()
这样其中"代码"就没有同步问题了
毫无疑问用事件的方式比用挂起的方式更有符合习惯,顺便说一下,我没有看到在你的线程挂起以后怎么唤醒呢?
至于说到效率问题,两种方式的效率肯定是不一样的,因为线程的调度是在内核模式进行的,我们使用的都是微软提供的用户模式的API,我们很难了解这两种方式在系统内部是怎么处理的,那么为什么不采用一种微软文档里面有详细资料,而且使用非常普遍的同步方式呢?
如果用event的方式的话,有个好处就是各个线程平时可以自行其事,只有到相互之间需要同步的时候再同步就好。其实这两种处理方式只是大家考虑问题的角度不同罢了。
=========================================
这种观念对于某些实际应用上的设计有点不太理想.更何况现在都讲求I/O重叠,也就是在一条线路上同时收发,并且互不干扰(此时一方出错,处理的时候最好不要使用closesocket,而采用shutdown).
dronly(蚊子) 可能我没有把实际情况给你说清楚,unsigned()兄的说法可以对你解释了。现在我还是选择了CreateEvent来实现,新问题又出来了。我有个全局变量a,只会在一个线程thread1中会进行a赋值操作,其他thread2线程只会进行a读取操作,所以我没有进行互斥保护,但是现在偶尔会出现在线程thread2读值操作以后setevent,thread1中waitforsingleobject()同步以后,这个a值偶尔会发生改变。真不知道怎么会变,因为a的赋值在thread1中。
{
DWORD iRet;
while(1)
{
event2.SetEvent();//开启接收线程//如果100ms没有收到应该收到的数据,就不在等待.
iRet = WaitForSingleObject(event1, 100);
switch()
{
case WAIT_TIMEOUT:
event2.ResetEvent();//接收超时,挂起接收线程,
//这里用thread2->suspendThread(),来代替好不
break;
case WAIT_OBJECT_0:
//发送数据完成后,就开启接收线程,等待数据接收
/....../
~~~~~~~~~~~~~~~~~~~应该在收到event1这个事件(即收到50个)后再发送吧???
不然没收满50个也在不停的发
发送完以后还要清零
break;
}
sleep(10);
}
}
发完以后肯定是清0了。
现在是那个全局变量要变,很奇怪?