Обратный вызов Delphi datasnap - вопрос BroadCast - PullRequest
3 голосов
/ 08 мая 2011

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

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

Попробуйте создать простой сервер VCL datasnap - 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 ]

2 голосов
/ 13 мая 2011

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

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

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

Mat

0 голосов
/ 08 мая 2011

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

Delphi XE help: (ms-помощь: //embarcadero.rs_xe/vcl/DSServer.TDSServer.BroadcastObject.html): функция BroadcastObject (const ChannelName: String; const CallbackId: String; const Msg: TObject): логический;перегрузки;

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

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

...