4#ifndef QOHOSBATCHINGREQUESTSHANDLER_H
5#define QOHOSBATCHINGREQUESTSHANDLER_H
7#include <QtCore/QtGlobal>
8#include <QtCore/private/qohoscommon_p.h>
9#include <QtCore/qmetaobject.h>
10#include <QtCore/qobject.h>
14#include <qohosplugincore.h>
24 return [qtContext](
std::function<
void()> task) {
25 qtContext.visitInQtThreadIfAlive(
26 [task = std::move(task)](
auto &) {
32template<
typename Batch>
37 QOhosConsumer<std::function<
void()>> tasksExecutor, std::function<
void(Batch &&)> targetThreadHandleBatchFunc);
42 void postRequestTaskIfNeeded();
44 std::mutex m_batchMutex;
46 bool m_batchPending =
false;
47 QOhosConsumer<std::function<
void()>> m_tasksExecutor;
48 std::function<
void(Batch &&)> m_targetThreadHandleBatchFunc;
51template<
typename Batch>
53 QOhosConsumer<std::function<
void()>> tasksExecutor,
std::function<
void(Batch &&)> targetThreadHandleBatchFunc)
54 : m_tasksExecutor(tasksExecutor)
55 , m_targetThreadHandleBatchFunc(
std::move(targetThreadHandleBatchFunc))
59template<
typename Batch>
62 std::lock_guard<
std::mutex> requestLock(m_batchMutex);
66 if (!m_batchPending) {
70 auto self = weakSelf.lock();
72 std::unique_ptr<Batch> optRequest;
74 std::lock_guard<std::mutex> requestLock(self->m_batchMutex);
75 if (self->m_batchPending) {
76 optRequest = std::make_unique<Batch>(std::exchange(self->m_batch, Batch()));
77 self->m_batchPending =
false;
81 self->m_targetThreadHandleBatchFunc(std::move(*optRequest));
84 m_batchPending =
true;
90template<
typename Request>
92 QOhosConsumer<std::function<
void()>> tasksExecutor,
93 QOhosConsumer<Request &&> targetThreadBatchConsumer);
95template<
typename QtRequest>
97 QtOhos::QObjectThreadSafeRef qtContext,
std::function<
void(QtRequest &&)> qtHandleRequestFunc);
99template<
typename QtRequest>
101 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer);
103template<
typename Request>
105 QOhosConsumer<std::function<
void()>> tasksExecutor,
106 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer);
108template<
typename Request>
110 QOhosConsumer<std::function<
void()>> tasksExecutor,
111 QOhosConsumer<Request &&> targetThreadBatchConsumer)
115 std::move(tasksExecutor),
std::move(targetThreadBatchConsumer));
116 return [requestsHandler](
const std::function<
void(Request &)> &updateFunc) {
117 requestsHandler->updateBatch(updateFunc);
121template<
typename QtRequest>
123 QtOhos::QObjectThreadSafeRef qtContext,
std::function<
void(QtRequest &&)> qtHandleRequestFunc)
126 return makeQtOhosBatchingMTRequestsHandler(
127 makeQtThreadTasksExecutor(qtContext),
std::move(qtHandleRequestFunc));
130template<
typename QtRequest>
132 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer)
135 return makeQtOhosSimpleBatchingMTRequestsHandler(
136 makeQtThreadTasksExecutor(qtContext),
std::move(qtThreadBatchConsumer));
139template<
typename Request>
141 QOhosConsumer<std::function<
void()>> tasksExecutor,
142 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer)
145 auto baseRequestsHandler = std::make_shared<QtOhosBatchingAsyncMTRequestsHandler<std::vector<Request>>>(
146 std::move(tasksExecutor), std::move(targetThreadBatchConsumer));
147 return [baseRequestsHandler = std::move(baseRequestsHandler)](Request request) {
148 baseRequestsHandler->updateBatch(
149 [&](std::vector<Request> &batch) {
150 batch.push_back(
std::move(request));
void updateBatch(const std::function< void(Batch &)> &updateFunc)
std::function< void()> makeVSyncFrameRequester(::OHNativeWindow *nativeWindow, std::function< void()> vsyncFrameReadyFunc)
Combined button and popup list for selecting options.
QOhosConsumer< std::function< void()> > makeQtThreadTasksExecutor(QtOhos::QObjectThreadSafeRef qtContext)
QOhosConsumer< QtRequest > makeQtOhosSimpleBatchingQtRequestsHandler(QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer< std::vector< QtRequest > > qtThreadBatchConsumer)
std::function< void(std::function< void(Request &)>)> makeQtOhosBatchingMTRequestsHandler(QOhosConsumer< std::function< void()> > tasksExecutor, QOhosConsumer< Request && > targetThreadBatchConsumer)
QOhosConsumer< Request > makeQtOhosSimpleBatchingMTRequestsHandler(QOhosConsumer< std::function< void()> > tasksExecutor, QOhosConsumer< std::vector< Request > > targetThreadBatchConsumer)
std::function< void(std::function< void(QtRequest &)>)> makeQtOhosBatchingQtRequestsHandler(QtOhos::QObjectThreadSafeRef qtContext, std::function< void(QtRequest &&)> qtHandleRequestFunc)
std::size_t operator()(const VsyncId &vsyncId) const noexcept
QtOhos::TypedId< std::uintptr_t, struct VsyncIdTag > VsyncId