2012-09-09 2 views
1

TADOConnection을 사용하여 MSSQL에 연결하는 서비스 응용 프로그램이 있으며 클라이언트 응용 프로그램에 Cromis.IPCTIPCServer 개체를 사용하는 일부 데이터가 제공됩니다. 이 서비스 응용 프로그램은 MSSQL을 실행하는 동일한 컴퓨터에 설치 될 수 있으며 MSSQL 서비스 전에 시작될 수 있습니다. 따라서 OnServiceStart 이벤트에서 ADO에 연결할 수 없습니다. 내가 의 이벤트에서 TIPCServer의 ADO에 연결하려했지만, 그것은 별도의 스레드에서 실행되고 있기 때문에 "CoInitialize가 호출되지 않았습니다"라는 메시지가 나타납니다. 그런 다음 이걸 내 메인 스레드와 동기화하려고 시도했습니다.Cromis IPC 동기화 - 응용 프로그램이 응답하지 않습니다.

TThread.Synchronize(nil, ConnectDB); 

그러나 작동하지 않았습니다. 내 응용 프로그램이 바로 응답하지 않습니다.

다음에, I는 매개 변수로 호출하는 스레드를 전달하는 이벤트를 OnExecuteRequest 변형 및 I이 시도 :

AThread.Synchronize(AThread, ConnectDB); 

하지만 변화. 디버그 DCU 사용을 켜면 내 응용 프로그램이이 줄에서 응답을 중지한다는 것을 알았습니다.

function WaitForSyncWaitObj(P: Pointer; Timeout: Cardinal): Integer; 
begin 
    Result := WaitForSingleObject(THandle(P), Timeout); // <-- I'm stuck here... 
end; 

저는 완전히 잃었습니다. 어떤 아이디어?


추신 : 질문이 어지럽히 지 않도록 코드를 제공하지 않았습니다. 그 중 일부가 필요한 경우 알려주세요.


PS 2 :이 전에는 서비스 응용 프로그램에서 Timer를 사용하여 MSSQL에 연결하기 전에 일정 기간 동안 기다렸습니다. 네트워크 드라이버가로드되기 전에도 MSSQL이 곧 시작되는 것 같습니다 (네트워크 드라이버를 대체하는 McAfee VSE 8.7이 설치되어 있습니다). 내 서비스는 MSSQL에 연결되지만 네트워크 드라이버가로드되면 연결이 끊어집니다. 네트워크 드라이버가로드 된 후 서비스를 시작하기 위해 Windows (XP 이상)에 알리는 방법이 있으면 문제가 해결됩니다. 어떤 힌트도 정말 고맙습니다.

답변

1

TThread 생성자에서 CoInitialize(nil);을 호출하고 소멸자에서 CoUnitialize을 호출하십시오. 둘 다 ComObj 단위로 선언됩니다. 스레드 클래스를 포함하는 유닛의 uses 절에 추가해야 할 수도 있습니다.

데이터베이스 연결은 스레드마다 다르며 (즉, 각 스레드마다 자체 연결이 있어야 함) ADO에는 COM이 필요합니다. 이는 스레드가 COM을 자체적으로 초기화해야한다는 것을 의미하며 스레드가 종료 될 때 스레드를 해제해야합니다.

+0

나는'CoInitialie()'에 대해 알고 있지만 내 메인 스레드에서도 ADO 연결에 액세스해야한다. –

+0

그러면 두 개의 별도 연결이 필요합니다. ** 데이터베이스 연결은 스레드 관련 **입니다. :-) –

+0

메인 스레드에서만 ADO 연결 만 필요하다고 상상해보십시오. 내 질문에 왜'동기화 '호출이 멈추는 지 ... –

관련 문제