annotate foosdk/sdk/foobar2000/SDK/main_thread_callback.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // fb2k::inMainThread moved to threadsLite.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // ======================================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 // API declarations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 // ======================================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Callback object class for main_thread_callback_manager service. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! You do not need to implement this directly - simply use fb2k::inMainThread() with a lambda.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class NOVTABLE main_thread_callback : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! Gets called from main app thread. See main_thread_callback_manager description for more info.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 virtual void callback_run() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 void callback_enqueue(); // helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 FB2K_MAKE_SERVICE_INTERFACE(main_thread_callback,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 /*!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 Allows you to queue a callback object to be called from main app thread. This is commonly used to trigger main-thread-only API calls from worker threads.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 This can be also used from main app thread, to avoid race conditions when trying to use APIs that dispatch global callbacks from inside some other global callback, or using message loops / modal dialogs inside global callbacks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 There is no need to use this API directly - use fb2k::inMainThread() with a lambda.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 class NOVTABLE main_thread_callback_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 //! Queues a callback object. This can be called from any thread, implementation ensures multithread safety. Implementation will call p_callback->callback_run() once later. To get it called repeatedly, you would need to add your callback again. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //! Queued callbacks will be called in the same order as they were queued (FIFO).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual void add_callback(service_ptr_t<main_thread_callback> p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 FB2K_MAKE_SERVICE_COREAPI(main_thread_callback_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! Additional method added to help recovering from method-called-in-wrong-thread scenarios.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 class NOVTABLE main_thread_callback_manager_v2 : public main_thread_callback_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(main_thread_callback_manager_v2, main_thread_callback_manager)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Uses win32 SendMessage() to invoke your callback synchronously, blocks until done. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 //! If multiple threads call this, order of callbacks is undefined. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 //! Callbacks run_synchronously() callbacks take precedence over add_callback().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 virtual void run_synchronously( main_thread_callback::ptr ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 // ======================================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 // Obsolete helpers - they still work, but it's easier to just use fb2k::inMainThread().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 // ======================================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Helper, equivalent to main_thread_callback_manager::get()->add_callback(ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void main_thread_callback_add(main_thread_callback::ptr ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 template<typename t_class> static void main_thread_callback_spawn() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 main_thread_callback_add(new service_impl_t<t_class>);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 template<typename t_class, typename t_param1> static void main_thread_callback_spawn(const t_param1 & p1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 main_thread_callback_add(new service_impl_t<t_class>(p1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 template<typename t_class, typename t_param1, typename t_param2> static void main_thread_callback_spawn(const t_param1 & p1, const t_param2 & p2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 main_thread_callback_add(new service_impl_t<t_class>(p1, p2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 // More legacy helper code moved to helpers/callInMainThreadHelper.h