Обратный вызов Delphi datasnap - вопрос BroadCast

Я снова попал в ситуацию, когда я потратил непристойное количество времени, пытаясь настроить образцы обратного вызова datasnap для своих нужд. Я - программист ООП старой школы, и у меня есть несколько очень больших объектов Object в моем стиле PODO "toolbox":-) .. и, имея эту замечательную функцию захвата данных, я хочу использовать силы обратного вызова.

НО - когда я это реализую... он просто терпит неудачу... (FASTMM4 сообщает об утечках памяти).

Попробуйте создать простой сервер данных VCL - TCP. И добавить кнопку и этот источник...

procedure TForm1.Button1Click(Sender: TObject);
var
//  AObject : TObject;
  aJSONVal : TJSONValue;
begin
//  AObject := TObject.Create;
//  ServerContainer1.DSServer1.BroadcastObject('SomeChannel','SomeCallbackID', AObject);
//  AObject.Free;

  aJSONVal := TJSONObject.Create;
  ServerContainer1.DSServer1.BroadcastMessage('SomeChannel','SomeCallbackID',aJSONVal);
  // aJSONVal.Free; // Mat pointed out that this is done by the broadcast.
end;

Это будет работать - пока вы продолжаете использовать TJSONValue ... Но попробуйте переключить закомментированный код - и вы поймете, что я имею в виду.

Конечно, я мог бы изменить весь свой существующий код на JSON ... но это просто неприемлемо.

Кто-нибудь есть какие-либо идеи о том, как использовать BroadcastOBJECT или NotifyOBJECT?

С уважением, Бьярне

2 ответа

Решение

Возможный ответ: Ваш вопрос был неопределенным, но исходя из того, что вы сказали, я бы начал здесь:

Delphi XE help: (ms-help: //embarcadero.rs_xe/vcl/DSServer.TDSServer.BroadcastObject.html):

функция BroadcastObject(const ChannelName: String; const CallbackId: String; const Msg: TObject): логический; перегрузки;

Вторая перегрузка отправляет объект всем клиентским обратным вызовам с заданным зарегистрированным идентификатором обратного вызова. Для этого в вызове требуется дополнительный параметр CallbackId."

Вы используете вторую перегрузку, которая принимает 3 параметра. Правильно ли настроены ваши идентификаторы обратного вызова?

Объект, который вы передаете вызову Notify или Broadcast, затем принадлежит этому вызову. Поэтому не вызывайте "AObject.Free;" или "aJSONVal.Free;". Это часто приводит к нарушению прав доступа или другим проблемам, связанным с управлением памятью.

Также обратите внимание, что широковещательные сообщения помещаются в очередь на сервере, а затем отправляются в другом потоке. Это означает, что когда ваш звонок в Broadcast возвращается, он еще не отправил сообщение всем клиентам.

Надеюсь, это поможет,

Мат

Другие вопросы по тегам