请教多线程间通讯的方法,MSDN里的话我不是很清楚如何实现,现贴于此?急待高手解答!!!

wkoji 2003-01-02 10:33:32
我在MSDN上找到如下“Windows 句柄映射
作为通用规则,线程只能访问它创建的 MFC 对象。这是因为临时和永久性 Windows 句柄映射保留在线程本地存储中,以对它进行保护,确保不能有多个线程同时访问它。例如,辅助线程不能执行计算并调用文档的 UpdateAllViews 成员函数来修改包含新数据视图的窗口。此操作将不会有任何效果,因为从 CWnd 对象到 HWND 的映射是主线程的本地映射。这意味着一个线程可能有从 Windows 句柄到 C++ 对象的映射,但是另一个线程可能会将此句柄映射到其他 C++ 对象。在一个线程内所做的更改将不会反映在另一个线程中。
有几种方式可以避免此问题。首先是将各个句柄(如 HWND)而不是 C++ 对象传递到辅助线程。然后,辅助线程通过调用适当 FromHandle 成员函数将这些对象添加到它的临时映射。还可以通过调用 Attach 将对象添加到线程的永久映射,但只有在保证对象比线程存在的时间长时,才应当进行此操作。”

希望有大侠能给我解释一下,最好有源代码。
我的函数调用如下
AfxBeginThread(WorkerThread,pClient_Socket_FileName);
pClient_Socket_FileName是一个结构指针,我希望通过在pClient_Socket_FileName
改变标志变量的方式来控制各个线程之间的运行情况,以及和主线程通讯.
...全文
59 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
icelight 2003-01-07
线程间共享MFC对象很容易会出问题。《VC6宝典》里说得很详细。

如果只是线程间改变pClient_Socket_FileName里的一个标志变量的话,不需要知道与句柄有关的内容啊。
回复
wkoji 2003-01-07
我也奇怪,但是确实得到的只是拷贝。我是试着用全局变量传就可以使用了。
真是让我很疑惑。
回复
ggyy 2003-01-05
在创建子线程的时候可以将主线程的对象的句斌传递过啊!
你传递时时指针怎么会是访问的拷贝呢?
回复
wkoji 2003-01-04
我想在子线程中去调用主线程中的一个对象,由于线程的一些保护机制而实际只是调用了该对象的一个拷贝,而无法实际对主线程中的对象产生影响。我现在设立全局变量来调用是可以达到这个效果,但是我想知道除了使用全局变量来传递之外,是否还有其他方法可以让我在子线程中访问到主线程的实际对象。
回复
我不是大明 2003-01-03
PostThreadMessage();
回复
microyzy 2003-01-03
可以使用操作系统级别的东西,如内核对象,互斥,信号灯,事件等
回复
wkoji 2003-01-03
我在MSDN上看到Attach的用法是如何的呢?
难道除了设置全局变量外就没有办法了吗?
回复
qexl 2003-01-03
请参考<WIN32多线程程序设计>一书
这些东西讲得很多,我不知道你具体有什么问题
回复
liugy 2003-01-03
和主线程通讯 一般用全局变量
pClient_Socket_FileName改变标志变量可以的
例如:
struct aaa{
bool bStart;
...
bool bEnd;
};

if (bStart)
等待 bEnd==true;
....
回复
In355Hz 2003-01-03
你摘抄至 MSDN 的那一段话是关于 MFC 的句柄映射的,如果你的线程不使用任何外部创建的 CWnd / CGdiObject 派生对象,可以不管这段描述。

关于这段话的内容,你可以参考 MFC 代码里的以下几个类:CHandleMap(以及 CMapPtrToPtr), _AFX_THREAD_STATE(以及 CThreadLocal), 和 CWnd::FromHandle, CGdiObject::FromHandle 两个函数。

你的情况可以通过 Event 实现,在 pClient_Socket_FileName 结构中传送一个的 hEvent 句柄(参考 CreateEvent), 并且在多个线程间共用同一个 hEvent 对象, 然后通过 WaitForSingleObject / SetEvent 控制各个线程之间的运行同步。
回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2003-01-02 10:33
社区公告
暂无公告