2013-05-12 73 views
0

我在一个形式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的。操纵全局变量(在这样的处理程序中)安全 - 我的意思是访问这些变量是安全的?我打算只在这个处理程序中操作这个全局变量。我认为这是安全的,因为处理程序处理等待在队列中执行的消息。我的假设是否正确?

回答

0

不是,没有。如果你打算通过发送异步消息。 PostMessage,(不是说这是一个坏主意 - 比apialing TThread.Synchronize好得多),尽量发布消息处理程序所需的全部数据,即。不要使用全局变量。如果您必须传达很多东西,请在wParam/lParam中发布结构或对象指针。

不要使用全局变量,除非......没有什么是真的。

哦,另一件事 - 不要使用全局变量。

+0

@Maritn James:是的,我没有使用全局变量向处理程序发送信息。取而代之的是,我使用指向wParam/lParam中的数据结构的指针,就像你说的那样(也许我的问题还不够清楚 - 我很抱歉)。在通过l/Param发送信息给hadler之后,我想只在这个处理程序中主存全局数据。我使用临界区域计算并将所有结果写入一个全局变量(它保证足够短的时间 - 只有一个变量)。这个变量可以被另一个线程在tcp通信中使用(使用相同的关键部分)。它通常是正确的吗? – Artik 2013-05-14 04:12:47