| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 692 人关注过本帖
标题:请问这样添加代码为什么不能达到线程同步?
只看楼主 加入收藏
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
 问题点数:0 回复次数:4 
请问这样添加代码为什么不能达到线程同步?

我在用户框架之外弄了个辅助线程用于数据处理

UINT CNewDlg::ReceiveThread(void *param)
{
CNewDlg *dlg=(CNewDlg *) param;
dlg->GetParent();

WaitForSingleObject(dlg->hEvent, INFINITE);

。。。。////////////////////(1)

SetEvent(dlg->hEvent);

。。。。。
}

在用户界面的一个按钮函数下,添加如下代码:

void CNewDlg::OnButtonResetcan()
{
WaitForSingleObject(hEvent, INFINITE);
。。。
SetEvent(hEvent);
return;
}

当辅助线程运行到////////////////////(1)处时,若按下用户界面中的OnButtonResetca
n() 对应的按钮,程序立即从辅助线程处断开去执行主线程,不知道为什么辅助线程没有
运行到SetEvent(dlg->hEvent);就直接去执行用户界面程序了?为什么不能达到同步的目
的呢?
谢谢!

搜索更多相关主题的帖子: 线程 代码 
2006-08-13 18:37
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 

请检查你用CreateEvent创建event时的第二个参数是否为FALSE,如果你想用TRUE的话需要在void CNewDlg::OnButtonResetcan() 函数中的WaitForSingleObject(hEvent, INFINITE);前手动重设ResetEvent(hEvent)


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-08-14 09:42
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 

void CNewDlg::OnButtonSenddata()
{
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEvent);

pWorkThread=AfxBeginThread(ReceiveThread,this);
}

创建的event第二个参数是FALSE的

另外:
我在程序中增加一全局变量用于判断也不能达到目的:
BOOL m_endthread=TRUE;
volatile HANDLE hEvent=NULL;

void CNewDlg::OnButtonResetcan()
{
if(m_endthread==FALSE)
{
Sleep(100);
}

WaitForSingleObject(hEvent, INFINITE);
...................

SetEvent(hEvent);

..................
}

void CNewDlg::OnButtonSenddata()
{
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEvent);
pWorkThread=AfxBeginThread(ReceiveThread,this);
}

UINT CNewDlg::ReceiveThread(void *param)
{
CNewDlg *dlg=(CNewDlg *) param;
dlg->GetParent();
.............

WaitForSingleObject(dlg->hEvent, INFINITE);

m_endthread=FALSE;
........
。..........////////////////////(1)
SetEvent(dlg->hEvent);
m_endthread=TRUE; //(2)


}
辅助线程运行到(1)时若被主线程OnButtonResetcan() 函数打断,则Sleep后辅助线程还
是不能运行到(2)处,好像Sleep没有作用,OnButtonResetcan() 函数里Sleep完后继续
顺序执行了,而此时由于辅助里SetEvent(dlg->hEvent) //(2)
这句没有执行,导致程序在主线程WaitForSingleObject(hEvent, INFINITE)处停止了,

奇怪为什么不能达到我想的目的呢(就是辅助(1)跳转到主线程,由于Sleep作用主线程
等待 程序继续回到辅助线程运行,直到(2)句运行完后再回到主线程继续运行)?


2006-08-14 12:03
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
一个疑点:你在OnButtonSenddata中创建的event赋给了全局变量hEvent,而不是类成员hEvent,但是在ReceiveThread中的WaitForSingleObject中输入的却是类成员的hEvent
从其它代码上来看你对于event的用法没什么问题,另外用WaitForSingleObject的话前面不用sleep的
最后建议你用winapi时最好判断返回值,如CreateEvent返回的HANDLE是否为NULL,WaitForSingleObject有没有返回失败等

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-08-14 13:50
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 
谢谢斑竹的精彩点评与建议
以后我会注意的

2006-08-15 22:36
快速回复:请问这样添加代码为什么不能达到线程同步?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024159 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved