Last time, we refined our change counter-based stateful but coalescing update notification. This version still relies on a UI thread to do two things: (1) make the final final change counter check and the subsequent callback atomic, and (2) to serialize the callbacks.
Adding State to the Update Notification Pattern, Part 7
by Raymond Chen
From the article:
If we don’t have a UI thread, then we open a race condition.
class EditControl { ⟦ ... existing class members ... ⟧ std::atomic<unsigned> m_latestId; }; winrt::fire_and_forget EditControl::TextChanged(std::string text) { auto lifetime = get_strong(); auto id = m_latestId.fetch_add(1, std::memory_order_relaxed); co_await winrt::resume_background(); if (!IsLatestId(id))) co_return; std::vector<std::string> matches; for (auto&& candidate : FindCandidates(text)) { if (candidate.Verify()) { matches.push_back(candidate.Text()); } if (!IsLatestId(id))) co_return; } // co_await winrt::resume_foreground(Dispatcher()); if (!IsLatestId(id))) co_return; SetAutocomplete(matches); }
Add a Comment
Comments are closed.