Еще раз извините за мой английский, я уже мигрировал клиент и сервер, и все работало хорошо, пока я не заметил, что модуль удаленных данных сервера не работает так, как ожидалось. Когда я запускаю запрос от клиента, который требует больше времени, другие модули удаленных данных остаются в ожидании (включая и основной поток). Он ведет себя так, как будто модель потока — tmSingle. Я огляделся и попробовал все, что нашел, но безуспешно. Еще более странно то, что там, где я зарегистрировал новый сервер (собранный на XE6), старый (собранный на D7) начал давать те же симптомы.
При установке нового сервера на машину, на которой уже работает старый, я использую
xxxxx.exe /unregserver (для старого) и
xxxxx.exe /regserver (для нового), а дальше заметна проблема. Даже если я отменю регистрацию нового сервера и зарегистрирую старый, проблема останется.
Клиент и сервер взаимодействуют через DataSnap Socket (клиент с TSocketConnection и TConnectionBroker).
Вот немного информации о сервере
Сервер_TLB
unit Server_TLB;
uses Windows, ActiveX, Classes, Graphics, Midas, StdVCL, Variants;
const
LIBID_Server: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}';
IID_IrdmServer: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}';
CLASS_rdmServer: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}';
IrdmServer = interface;
IrdmServerDisp = dispinterface;
rdmServer = IrdmServer;
IrdmServer = interface(IAppServer)
['{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}']
........... methods..........
IrdmServerDisp = dispinterface
['{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}']
........... methods..........
CordmServer = class
class function Create: IrdmServer;
class function CreateRemote(const MachineName: string): IrdmServer;
implementation
uses ComObj;
class function CordmServer.Create: IrdmServer;
begin
Result := CreateComObject(CLASS_rdmServer) as IrdmServer;
end;
class function CordmServer.CreateRemote(const MachineName: string): IrdmServer;
begin
Result := CreateRemoteComObject(MachineName, CLASS_rdmServer) as IrdmServer;
end;
end.
..инициализация RDM
initialization
TComponentFactory.Create(ComServer, TrdmServer,
Class_rdmServer, ciMultiInstance, tmFree);
..последовательность создания
Forms.Application.ShowMainForm := False;
Forms.Application.Initialize;
Forms.Application.CreateForm(TdmServer, dmServer);
Forms.Application.CreateForm(TfMain, fMain);
windows.PostMessage(fMain.Handle, MSG_INITIALIZE, 0, 0);
Forms.Application.Run;
со стандартным SocketDispatcher и стандартным SConnect
Также уже пробовал с ключом настройки
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}\InprocServer32]
"ThreadingModel"="Free" or "Both"
Я пропустил что-то еще?
Спасибо вам за помощь!