TADOConnection
을 사용하여 MSSQL에 연결하는 서비스 응용 프로그램이 있으며 클라이언트 응용 프로그램에 Cromis.IPC
의 TIPCServer
개체를 사용하는 일부 데이터가 제공됩니다. 이 서비스 응용 프로그램은 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 이상)에 알리는 방법이 있으면 문제가 해결됩니다. 어떤 힌트도 정말 고맙습니다.
나는'CoInitialie()'에 대해 알고 있지만 내 메인 스레드에서도 ADO 연결에 액세스해야한다. –
그러면 두 개의 별도 연결이 필요합니다. ** 데이터베이스 연결은 스레드 관련 **입니다. :-) –
메인 스레드에서만 ADO 연결 만 필요하다고 상상해보십시오. 내 질문에 왜'동기화 '호출이 멈추는 지 ... –