Thread safety Delphi、消息处理程序和全局变量线程安全

Thread safety Delphi、消息处理程序和全局变量线程安全,thread-safety,queue,postmessage,Thread Safety,Queue,Postmessage,我有一个messagehandler,格式如下: procedure TMain_Form.form_message_handler(var MSG: TMessage); begin case MSG.WParam of 0: global_variable:=10; 1: global_variable:=global_variable+100; end; end; 几个线程将向它发送异步消息-PostMessage。全局变量的操作(在这样的处理程序中)安全吗?我的意

我有一个messagehandler,格式如下:

procedure TMain_Form.form_message_handler(var MSG: TMessage);
begin
  case MSG.WParam of
   0: global_variable:=10;
   1: global_variable:=global_variable+100;
   end;
end;

几个线程将向它发送异步消息-PostMessage。全局变量的操作(在这样的处理程序中)安全吗?我的意思是访问这些变量是安全的?我将计划只在这个处理程序中操作这个全局变量。我假设它是安全的,因为处理程序处理的消息在队列中等待执行。我的假设正确吗?

不正确,不正确。如果要通过发送异步消息。PostMessage(并不是说这是一个坏主意——比Apaling TThread.Synchronize要好得多),尽量发布消息处理程序所需的所有数据,即不要使用全局变量。如果需要进行大量通信,请在wParam/lParam中发布一个结构或对象指针

除非。。。没什么


哦,还有一件事——不要使用全局变量。

@Maritn James:是的,我不使用全局变量向处理程序发送信息。相反,我使用指向wParam/lParam中数据结构的指针,就像您所说的(可能我的问题不够清楚-对不起)。在通过l/Param向hadler发送信息后,我只想在这个处理程序中维护全局数据。我使用critical section在一个全局变量中计算和写入所有结果(它保证足够短的时间-只有一个变量)。此变量可由tcp通信中使用的另一个线程使用(使用相同的临界段)。一般来说是正确的吗?