I develop with EMA C++
I found I can only decode the RefreshMsg once .
First, I decode the RefreshMsg, to get Struct A;
Then, I decode the RefreshMsg, to get Struct B, but failed, all the FIDs become "blank data"
In your capture, you are pointing to NULL = ptr, but I am guessing you mean the FieldList being blank?
I cannot see your full code, but I notice you are using FieldList iterator
while( fl.forth() )
to iterate through the FieldList.
As you may know the while() will loop until it reaches the end of the FieldList.
So, once you have iterated to the end of the FieldList, do you then reset the iterator, before you start the 2nd decode attempt?
As you may be aware, the callback client event handlers such as onRefreshMsg and onUpdateMsg are executed on the API thread context.
In view of this, you should always try and minimise the time spent processing data in the API thread context when you receive a RefreshMsg or UpdateMsg. Otherwise, you risk creating a Slow Consumer scenario where the API is not able to read data quickly enough from the server, causing buffering of data on the ADS and possible disconnect if the buffer overflows.
Therefore, I would advise against decoding a FieldList twice. I would recommend decoding the FieldList once and extracting the fields into application owned containers. You can then process the application owned object in a separate thread - thereby freeing up the API thread to return and continue processing the next message from the server.
The above applies if you plan to consume a higher number of instruments which update frequently. If, however, you are only consuming a relatively low number, then the Slow Consumer scenario may not arise. I cannot define what constitutes high number / low number as this depends on many factors.