主线程中的全局变量,如何让其它线程修改? ---在线等 ( 积分: 50 )

  • 主题发起人 主题发起人 love51
  • 开始时间 开始时间
L

love51

Unregistered / Unconfirmed
GUEST, unregistred user!
现在遇到的问题是,主线程中的全局变量,其它线程修改不了。
 
现在遇到的问题是,主线程中的全局变量,其它线程修改不了。
 
不同线程之间最大的问题就是数据交换问题。
主线程修改其它线程的变量可以使用线程属性设置(因为主线程创建其它线程)
其它线程修改主线程的变量需要用消息或事件等其他方法来实现。相对来说比较麻烦
 
全局变量的归属于进程,为什么不能被线程修改?
需要考虑的是防止多个线程同时修改一个全局变量,对于简单的整型变量可用
InterlockedIncrement 系列函数修改,或使用其它同步方式。
 
请savetime, 详细说明一下InterlockedIncrement 系列函数的使用,谢谢!
 
全局变量:i
InterlockedIncrement(i);
在线程中执行 i:=i+1,也就是相当于线程外的inc函数;
InterlockedDecrement(i);
在线程中执行 i:=i-1,也就是相当于线程外的dec函数;
InterlockedExchange(i,10);
在线程中将i替换为10;
InterlockedExchangeAdd (i,10);
在线程中执行 i:=i+10;
InterlockedCompareExchange(i,10,2);
当线程中i=2时,i被替换成10;
其它类型的全局变量,你可以:
在线程中使用一个过程来处理变量;
在线程中使用Synchronize(过程),来使过程同步,主要是为了防止多线程同时写该变量。
 
其实就是使用一些同步函数、信号量之类的就可以了。
delphi中自身就带有例子 ../demos/Threads
 
对于楼主所说的情况,可以使用以下几种方法来实现:
1.临界区变量(CriticalSection)
2.事件对象(Event)
3.信号灯对象(Semaphore)
几种方法原理跟实现代码都有点类似,举例临界区对象.
var
GlobalVariable:Double;
var
CriticalSection:TRTLCriticalSection;
procedure SetGlobalVariable(Value:Double);
begin
EnterCriticalSection(CriticalSection);
try
GlobalVariable:=Value;
finally
LeaveCriticalSection(CriticalSection);
end;
end;

initialization
InitializeCriticalSection(CriticalSection);
finalization
DeleteCriticalSection(CriticalSection);
end.
 
谢谢SAVETIME,帮我解决了一个大问题(后我查看了DELPHI帮助就知道了,呵呵),也谢谢ZYONG和SMOKINGROOM的详细例子,还有CHNPLZH和YOSTGXF的帮助
 
后退
顶部