Реферат: Обратные вызовы в MIDAS через TSocketConnection
try
for i := 0 to Count - 1 do
if Items[i] <> Self then // длявсех, кромесебя
if not TCallbackStub(Items[i]).OnCall(MsgStr) then
begin
LastError := GetLastError;
if LastError <> ERROR_SUCCESS then
ErrList := ErrList + SysErrorMessage(LastError) + #13#10
else
ErrList := ErrList + 'Что-тонепонятное' + #13#10;
end;
if ErrList <> '' then
raise Exception.Create('Возниклиошибки:'#13#10 + ErrList);
finally
Callbacklist.UnlockList;
end;
end;
Организуется проход по списку Callbacklist, и для всех TCallbackStub в списке вызывается метод OnCall. Если вызов не получился, собираем ошибки и выдаем сообщение. Ошибка может быть системной, как видно ниже. Я не стал создавать свой класс исключительной ситуации, на клиенте она все равно будет выглядеть как EOLEException.
Если бы модель потоков была tmSingle, в методе OnCall достаточно было бы просто вызвать соответствующий метод интерфейса IBackCallDisp, но при создании удаленного модуля данных была выбрана модель tmApartment, и прямой вызов IBackcallDisp.OnCall немедленно приводит к ошибке, потоки-то разные. Поэтому приходится делать вызовы интерфейса из его собственного потока. Для этого используется окно, создаваемое каждым экземпляром класса TCallBackStub, handle которого и хранится в переменной FCallBackWnd. Основная идея такая: вместо прямого вызова интерфейса послать сообщение в окно, и вызвать метод интерфейса в процедуре обработки сообщений этого окна, которая обработает сообщение в контексте потока, создавшего окно:
function TCallBackStub.OnCall(const MsgStr: WideString): BOOL; var MsgClass: TMsgClass; begin Result := True; if Assigned(FClientIntf) and (FCallbackWnd <> 0) then begin //MsgClass - это просто оболочка для сообщения, здесь же можно передавать //дополнительную служебную информацию. MsgClass := TMsgClass.Create; К-во Просмотров: 515
Бесплатно скачать Реферат: Обратные вызовы в MIDAS через TSocketConnection
|