Реферат: Обратные вызовы в 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