2012-11-17 2 views
2

필자는 com 서버를 구현 한 Delphi7 프로그램을 가지고 있습니다. 최근 몇 가지 새로운 데이터베이스 쿼리로 인해 프로그램 초기화가 완료되는 시간이 다소 증가했습니다. 프로그램 initlisation이 의미하는 것은 프로그램이 들어오는 com 호출을 의미있는 방식으로 처리 할 수있는 시간입니다. 내 질문은 프로그램이 제대로 초기화되지 않은 경우 들어오는 COM 호출을 처리 할 수있는 방법입니다. 호출에 포함 된 정보를 삭제하는 것은 옵션이 아니므로 호출은 프로그램이 초기화 될 때까지 기다려야합니다. 부울 초기화 변수를 사용하는 간단한 while 루프가 충분합니까? com 호출이 주 VCL 스레드에서 실행된다는 것을 읽었 기 때문에 물어 봅니다. 잠시 동안 루프가 프로그램을 중단시킬 수 있다고 제안합니다 (초기화는 VCL 스레드에서도 발생합니다).Delphi7 프로그램 초기화가 완료 될 때까지 Com 객체를 대기 상태로 만드는 방법은 무엇입니까?

뮤텍스는 동일한 스레드 내에서 실행되는 코드를 기다리는 데 사용할 수 없습니까?

다른 방법으로 말하면, com은 완료 될 때까지 (com 서버의) VCL 스레드의 인터럽트 실행을 호출합니까? 아니면 동일한 스레드 내에서 코드의 동시 실행이 어떻게 작동합니까? 시간을내어 주셔서 감사합니다.

+0

COM은 기다리지 않아도됩니다. 왜 돕고 싶니? 도와주지 마. –

+0

그러나 COM 호출이 vcl 스레드 내에서 실행되고 초기화가 VCL 스레드 내에서 발생하면 while 루프가 해당 스레드를 차단하고 initilisation이 끝나지 않게합니다. Windows가 com 서버를 포함하는 delphi 프로그램을 시작하면 com 함수가 호출되기 전에 섹션 (초기화 섹션, 양식 작성)이 실행됩니까? 그때 나는 초기화 기능이 완료되기 전에 COM 기능이 실행되지 않도록 할 수 있습니다. – MCS

답변

1

더 이상 차단되지 않도록 데이터베이스 논리를 주 스레드 밖으로 이동하십시오.

+0

초기화는 GUI에 대한 정보 표시에 의존합니다. 만약 내가 다른 스레드로 내가 동기화 (내가) 호출하거나 액세스 위반을 피하기 위해 메시지를 사용해야합니다, VCL 구성 요소는 스레드 안전하지 않습니다 (실제로 그 부분에 대해 확실하지 않지만 그 VCL을 이해하는 방법) 일하다). 이 전제가 올바른 경우 VCL 스레드가 COM 호출에 걸려 있기 때문에 이러한 메커니즘 중 하나가 프로그램을 중지하지 않습니다. 흠. 아니면이 시나리오에서 뮤텍스를 사용하고 기다릴 수 있습니까? – MCS

+0

그런 다음 UI에서 초기화를 분리하십시오. 초기화를 통해 정보를 어딘가에 메모리에 저장하고 계속 이동 한 다음 UI에서 해당 정보를 선택하여 여유있게 표시되도록하십시오. –

0

COM 서버 (EXE)는 COM 클라이언트에 제어 흐름을 반환하기 전에 Applcation.Run을 대기하므로 모든 양식과 데이터 모듈을 초기화해야합니다.

그러나 양식에서 다른 OLE 개체 (FormCreate() 이벤트 핸들러에서 Word 문서 열기)를 만들면 대기가 중단되고 COM 클라이언트에 대한 제어가 즉시 반환 될 수 있습니다.

Applcation.Run 전에 생성 된 양식의 초기화 코드를 모두 확인하여 문제를 현지화하십시오.

관련 문제