public override void on_data_on_readers( DDS.Subscriber sub) { /* IMPORTANT for GROUP access scope: Invoking begin_access() */ sub.begin_access(); /* Obtain DataReaders. We obtain a sequence of DataReaders that specifies the order in which each sample should be read */ try { sub.get_datareaders(my_datareaders, DDS.SampleStateKind.ANY_SAMPLE_STATE, DDS.ViewStateKind.ANY_VIEW_STATE, DDS.InstanceStateKind.ANY_INSTANCE_STATE); } catch (DDS.Exception e) { Console.WriteLine("get_datareaders error {0}", e); my_datareaders.ensure_length(0, 0); sub.end_access(); return; } /* Read the samples received, following the DataReaders sequence */ try { for (int i = 0; i < my_datareaders.length; ++i) { try { ordered_group_reader = (ordered_groupDataReader) my_datareaders.get_at(i); } catch (DDS.Exception e) { Console.WriteLine("my_datareaders.get_at error {0}", e); sub.end_access(); return; } /* IMPORTANT. Use take_next_sample(). We need to take only * one sample each time, as we want to follow the sequence * of DataReaders. This way the samples will be returned in * the order in which they were modified */ ordered_group_reader.take_next_sample(data, info); if (info.valid_data) { ordered_groupTypeSupport.print_data(data); } my_datareaders.ensure_length(0, 0); /* IMPORTANT for GROUP access scope: Invoking end_access() */ sub.end_access(); } } catch (DDS.Retcode_NoData noData) { //No data to process } }