Jump to content

snodev

Members
  • Content Count

    3
  • Joined

  • Last visited

Everything posted by snodev

  1. I new using TClientDataSet and would like some help. My application fetch heavy stream data from an external web-socket like API (from multiple channels), proccess it asap in worker threads and then show to the user when requested... nowdays I do it manually with lists, arrays and iterate to populate the components (manually). I want to improve and standartize the data in the application memory, the approach I thought is to go with TClientDataSet. The problem is that the application works with a heavy multithread system (which works pretty well, its not the problem), and I know that the TClientDataSet is not thread-safe, and could have alot of problems to deal with, so I would like to ask who already faced this problem before, if I on the right way. My approach: • The worker threads (which will receive the data to proccess) will write in a own TClientDataSet, only the worker thread may write data in its dataset; • Operations (insert/update/delete) in worker thread TClientDataSet wouldn't be synchronized; • Operations and cloning will be protected by a sync object (TCriticalSection like); • The UI that must shown data may clone the worker thread TClientDataSet to have a read-only copy, which can be linked in VCL controls (like TDBGrid) and also iterated, filtered, etc. Anyone that experienced this scenario (or similar) can say if I on the right way to avoid thread synchronization and deadlock problems dealing with TClientDataSet in a multi-thread system?
  2. I do this currently. But instead of a dataset I use lists and dicts to hold the data, so my thread notify the mainthread (UI) to retrieve the data when necessary. My idea is precisely to change this usage, using a single TClientDataSet (by worker thread) that can synchronize with the UI transparently... which also let me work with more flexible UI components (like TDBGrid)…
  3. Thanks for the reply @Anders Melander! By "clone" I meant a cursor clone. Good to know that even cloning the cursor won't make it thread safe. I didn't know that. What would be a "private distinct copy" that you said? You mean like TClientDataSet.CopyDataSet/TClientDataSet.CopyRecords? No specific reason to not use TFDMemTable, I think they do almost the same thing with few differences. I'll take a look into that, but I must solve the thread safety before.
×