Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
task_runner_window.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WINDOW_H_
6#define FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WINDOW_H_
7
8#include <windows.h>
9
10#include <atomic>
11#include <chrono>
12#include <functional>
13#include <memory>
14#include <mutex>
15#include <string>
16#include <vector>
17
18#include "flutter/fml/macros.h"
19
20namespace flutter {
21
22namespace testing {
23class TestTaskRunnerWindow;
24}
25
26// Background timer thread. Necessary because neither SetTimer nor
27// CreateThreadpoolTimer have good enough accuracy not to affect the
28// framerate.
30 public:
31 explicit TimerThread(std::function<void()> callback);
32
33 void Start();
34 void Stop();
35
37
38 // Schedules the callback to be called at specified time point. If there is
39 // already a callback scheduled earlier than the specified time point, does
40 // nothing.
41 void ScheduleAt(
42 std::chrono::time_point<std::chrono::high_resolution_clock> time_point);
43
44 private:
45 void TimerThreadMain();
46
47 std::mutex mutex_;
48 std::condition_variable cv_;
49 std::function<void()> callback_;
50 uint64_t schedule_counter_ = 0;
51 std::chrono::time_point<std::chrono::high_resolution_clock> next_fire_time_;
52 std::optional<std::thread> thread_;
53};
54
55// Hidden HWND responsible for processing flutter tasks on main thread
57 public:
58 class Delegate {
59 public:
60 // Executes expired task, and returns the duration until the next task
61 // deadline if exists, otherwise returns `std::chrono::nanoseconds::max()`.
62 //
63 // Each platform implementation must call this to schedule the tasks.
64 virtual std::chrono::nanoseconds ProcessTasks() = 0;
65 };
66
67 static std::shared_ptr<TaskRunnerWindow> GetSharedInstance();
68
69 // Triggers processing delegate tasks on main thread
70 void WakeUp();
71
72 void AddDelegate(Delegate* delegate);
73 void RemoveDelegate(Delegate* delegate);
74
75 void PollOnce(std::chrono::milliseconds timeout);
76
78
79 private:
82
83 void ProcessTasks();
84
85 void SetTimer(std::chrono::nanoseconds when);
86
87 WNDCLASS RegisterWindowClass();
88
90 HandleMessage(UINT const message,
91 WPARAM const wparam,
92 LPARAM const lparam) noexcept;
93
94 static LRESULT CALLBACK WndProc(HWND const window,
95 UINT const message,
96 WPARAM const wparam,
97 LPARAM const lparam) noexcept;
98
99 void OnTimer();
100
101 static void TimerProc(PTP_CALLBACK_INSTANCE Instance,
103 PTP_TIMER Timer);
104
105 HWND window_handle_;
106 std::wstring window_class_name_;
107 std::vector<Delegate*> delegates_;
108 DWORD thread_id_ = 0;
109 TimerThread timer_thread_;
110
111 // Used to prevent posting wake up message when one is already scheduled.
112 std::atomic_bool wake_up_posted_ = false;
113
115};
116} // namespace flutter
117
118#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WINDOW_H_
virtual std::chrono::nanoseconds ProcessTasks()=0
void PollOnce(std::chrono::milliseconds timeout)
static std::shared_ptr< TaskRunnerWindow > GetSharedInstance()
void AddDelegate(Delegate *delegate)
void RemoveDelegate(Delegate *delegate)
void ScheduleAt(std::chrono::time_point< std::chrono::high_resolution_clock > time_point)
To do anything rendering related with Impeller, you need a context.
Definition context.h:65
GLFWwindow * window
Definition main.cc:60
const char * message
FlutterDesktopBinaryReply callback
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
void * PVOID
LONG_PTR LRESULT
unsigned int UINT
LONG_PTR LPARAM
UINT_PTR WPARAM
unsigned long DWORD
#define CALLBACK