线程间传输数据(200分)

  • 主题发起人 主题发起人 wanggy
  • 开始时间 开始时间
W

wanggy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在线程间,须传送数据,使用全局变量,出错,同时对同一变量操作冲突。如何解决?
 
可以用互斥元
 
我是新手可否说明白一些?谢谢!!!
 
//定于互斥对象
var
EventHandle_in:Thandle;
//定于这几个过程
Procedure CreateEvent_Thread(EventName:string);
Procedure EnterCriticalSection_Thread;
Procedure LeaveCriticalSection_Thread;
//创建输入互斥对象
Procedure CreateEvent_Thread(EventName:string);
begin
EventHandle_in:=CreateEvent(nil,false,true,pchar(EventName));
end;

//进入输入互斥区
Procedure EnterCriticalSection_Thread;
begin
WaitForSingleObject(EventHandle_in,INFINITE);
end;

//离开输入互斥区
Procedure LeaveCriticalSection_Thread;
begin
setEvent(EventHandle_in);
end;

//然后在程序最前面调用这个生成互斥对象
CreateEvent_Thread('huajiyong');
//然后再用到全局变量的时候时候:
EnterCriticalSection_Thread;//进入互斥区
{处理全局变量}
LeaveCriticalSection_Thread;//退出互斥区
 
或者直接调用
var
CS:TrtlCriticalSection;
begin
..
EnterCriticalSection(CS);
...
LeaveCriticalSection(CS);
 
与其难受,不如一次过!长疼不如短疼!
我用楼上各位推荐的互斥办法,效果总不理想!
原因是好多时候线程的运行根本就等不到互斥同步释放就
已经进入另外一个境界了!于是。。。死机~!
所以现在我用一个新的办法:
通过NMUDP模拟来传递数据!
由于UDP协议是“只说不听”型的,不存在同步的问题
效果比同步或互斥好多了!
 
如果数据量不大,可用SendMessage
 
用CreateFileMapping
 
是否可以用PostMessge方法呢?
 
试试 PostThreadMessage()
 
不能说是线程间传输数据吧,应该是数据共享问题
也即是线程同步问题,你要保证一个线程对变量操作的时候不能有别的线程再操作变量
有几个方法可以解决这个问题: 临界区、互斥元、信号量等
g622已说了互斥元的用法,这是最简单的同步机制,注意的是,要先用API: InitializeCriticalSection
初始化CriticalSection,然后才能用Enter... Leave等API,详细信息请看API的帮助
临界区是Mutex,查找API帮助“Mutex Objects”,信号量:“Semaphore Objects”
 
多人接受答案了。
 
后退
顶部