There is a listview with several fields in delphi. A thread checks and adds items to listview. If there is the same caption, an integer will be added in the subitem of this
BeginUpdate and EndUpdate are an absolute must when updating the items. From your description it sounds like your looping through the items looking for a specific caption. This is slow and will get more noticeable with larger amounts of data, obviously.
Since your looking for a matching caption use the listviews FindCaption function.
This does a windows call to search the items and is fairly quick and simple. If it finds it it passes back the item and you can reference it to update the subitem. Otherwise create a new item and continue with your processing.
As long as your thread safe and you should be able to see decent performance.
HTH.