Обратный вызов 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 возвращается, он еще не отправил сообщение всем клиентам.
Надеюсь, это поможет,
Мат