2013-05-12 2 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 (나쁜 생각은 아닙니다.) - 메시지 처리기에 필요한 모든 데이터를 게시하기 위해 매우 열심히 노력하십시오. 예 : TThread.Synchronize. 전역을 사용하지 마십시오. 많은 것들을 전달해야한다면 wParam/lParam에 구조체 나 객체 포인터를 게시하십시오.

... 실제로 아무것도하지 않는 한 전역 변수를 사용하지 마십시오.

아, 또 다른 것은 - 전역을 사용하지 마십시오.

+0

@Maritn James : 예, 처리기에 정보를 보내기 위해 전역 변수를 사용하지 않습니다. 그 대신, 나는 wParam/lParam 내부의 데이터 구조체에 대한 포인터를 사용한다. (아마도 내 질문으로는 충분하지 않다 - 미안하다.) l/Param을 통해 hadler에게 정보를 보낸 후이 처리기 내에서만 전역 데이터를 유지하려고합니다. 나는 모든 결과를 하나의 전역 변수로 계산하고 임계 영역을 사용하여 작성합니다 (충분한 짧은 시간 - 단 하나의 변수 만 보장합니다). 이 변수는 tcp 통신을 사용하는 다른 하나의 쓰레드가 (동일한 임계 영역을 사용하여) 사용할 수 있습니다. 일반적으로 맞습니까? – Artik