로드/언로드 메커니즘 제어하기
모든 애드온은 Windows에서 DLL, Macintosh에서는 Mach-O 번들이라는 것을 기억하십시오.
만약 사용자가 애드온의 커맨드들 중 하나를 호출하면 애드온은 메모리로 로드됩니다.
그리고 나서 해당 커맨드가 실행되고 애드온은 메모리로부터 축출됩니다.
기본 호출 메커니즘
ArchiCAD 14에서 시작 메커니즘이 현저하게 바뀌었습니다. 이것은 ArhiCAD가 훨씬 더 빨리 시작되게 해줍니다.
- Add-On Manager는 애드온을 로드합니다. 그리고
-
- 애드온의 CheckEnvironment 함수를 호출합니다. 그리고 나서
- 애드온의 RegisterInterface 함수를 호출합니다.
- 만약 메모리에 미리 로드된/유지된 것이 없다면 애드온은 언로드됩니다.
- 사용자 요청
- 필요한 경우 애드온은 메모리로 로드됩니다.
- Initialize 함수가 호출됩니다.
- 해당 핸들러 함수가 호출됩니다.
- FreeData 함수가 호출됩니다.
- 만약 메모리에 유지된 것이 없다면 애드온은 언로드됩니다.
이 기본 scheme은 만약 기능이 복잡한 초기화/종료 절차를 필요로 하는 경우 상당히 불편하다. 애드온이 외부 데이터베이스 기반에서도 동작한다고 가정합니다. 만약 사용자가 데이터베이스에 저장되는 정보가 필요하다면, 먼저 초기화되어야 합니다. 그리고 나서 반드시 ArchiCAD 데이터베이스로 링크를 셋업해야 합니다. 오랜 시간이 걸릴 수 있습니다.
더 나은 해결책은 사용자가 커맨드를 얼마나 많이 호출하든 상관없이 애드온 자체가 1번만 초기화되는 것입니다. 물론 몇 번의 사용자 상호작용 간에 애드온이 메모리에 보존되어 있다면 구현할 수 있습니다. 이것은 초기화된 global 변수들과 동적 메모리 블록 등을 유지하는 유일한 방법입니다.
해결책은 핸들러 함수들이 호출될 동안 ACAPI_KeepInMemory 함수를 호출하는 것입니다. 이 함수를 호출하지 않아도 일부 동작들은(예. 애드온이 자체 팔레트를 갖고 있거나 알림 핸들러를 등록할 때) 애드온이 메모리에 유지되도록 합니다.
이 경우 애드온은 콜백 함수로부터 리턴될 때 메모리로부터 언로드되지 않습니다.
물론 애드온이 로드된 채로 남아 있다는 것은 FreeData
함수가 호출되지 않는다는 것을 의미합니다.
이 경우 다음 사용자 요청시에 애드온이 메모리로 로드될 필요가 없습니다.
그래서 Initialize
함수 또한 호출되지 않습니다.
서버 애플리케이션은 등록된 콜백 함수만 호출하게 됩니다.
규칙은 매우 쉽습니다:
- 애드온이 물리적으로 메모리에 로드된 직후 Initialize 함수가 호출됩니다.
- Initialize 함수가 성공적으로 실행되고 리턴되면 해당 콜백 함수가 호출됩니다.
- 애드온이 스왑-아웃되기 직전에 FreeData 함수가 호출되어야 합니다.
마지막 핸들러 함수가 ACAPI_KeepInMemory 함수를 호출하지 않고 팔레트들이 모두 없어지고 등록된 알림 핸들러들이 모두 등록해제되면 애드온은 반드시 언로드되어야 합니다.
참고: 만약 당신이 global 변수들을 갖고 있다면, 그 변수들은 애드온이 로드될 때마다 초기화되고, 언로드될 때마다 파괴됩니다. 이것은 단순한 애드온 커맨드에 대하여 3번의 초기화/종료 시퀀스가 있을 수 있음을 의미합니다. 이것은 애드온의 성능과 서버 애플리케이션의 구동 시간에 심각한 영향을 줄 수 있습니다. 특히 당신이 복잡한 C++ 클래스들을 global 변수인 인스턴스로 갖고 있을 경우 더 그러합니다. 물론, 이 global 변수들의 생성/파괴 도중 API (그리고 대부분의 모듈의) 서비스들은 이용할 수 없습니다. 예. 당신은 BM Memory Manager를 사용할 수 없습니다. 예전에는 이 경우 충돌을 야기하게 됩니다; 해결책은 pointer들만 사용하고 initialize 함수에서 global 인스턴스들만 생성하는 것입니다.
통제된 호출 메커니즘
위의 규칙들에 따라 당신은 당신 스스로 서버 애플리케이션에 의해 메모리에서 언로드되는 것을 막을 수 있습니다.
- 사용자 요청
- 애드온이 메모리로 로드됩니다.
Initialize
가 호출됩니다.- 핸들러 함수가 호출됩니다.
- 애드온이
ACAPI_KeepInMemory
를 호출합니다.
- 애드온이
- 사용자 요청
- 핸들러 함수가 호출됩니다.
- 애드온이
ACAPI_KeepInMemory
를 호출합니다.
- 애드온이
- 핸들러 함수가 호출됩니다.
- 사용자 요청
- 핸들러 함수가 호출됩니다.
- 애드온이
ACAPI_KeepInMemory
를 호출합니다.
- 애드온이
- 핸들러 함수가 호출됩니다.
- 사용자 요청
- 핸들러 함수가 호출됩니다.
FreeData
가 호출됩니다.
- 애드온이 언로드됩니다.
중요
만약 당신이 이 기능을 충분히 주의하지 않고 사용한다면 당신은 심각한 문제들을 경험할 수 있습니다.
예제: 당신은 실제 ArchiCAD 데이터베이스에 따라 당신의 데이터 구조를 초기화합니다. 당신의 코드는 메모리에 유지됩니다. 그러나 2개의 커맨드 간에 사용자는 다른 ArchiCAD 프로젝트를 열거나, 이미 열려 있는 프로젝트를 닫는 등의 작업을 합니다. 그러한 경우에는 당신의 초기화가 전혀 무효일 수도 있습니다.
이러한 이벤트들을 제어하려면, 당신은 반드시 ArchiCAD가 보낸 알림 코드들을 다루어야 합니다. 이것들은 알림 관리자에 문서화되어 있습니다. 이러한 알림 코드들을 추적하는 동안, 사용자가 새로운 프로젝트를 열거나 기존 프로젝트를 닫거나, 완전히 새로운 프로젝트를 생성하거나 ArhiCAD를 종료할 때 당신은 ArchiCAD에게 통보를 받게 될 것입니다.