4#ifndef QOHOSBATCHINGREQUESTSHANDLER_H
5#define QOHOSBATCHINGREQUESTSHANDLER_H
7#include <QtCore/qglobal.h>
8#include <QtCore/private/qohoscommon_p.h>
9#include <QtCore/qmetaobject.h>
10#include <QtCore/qobject.h>
14#include <qohosplugincore.h>
23 return [qtContext](
std::function<
void()> task) {
24 qtContext.visitInQtThreadIfAlive(
25 [task = std::move(task)](
auto &) {
31template<
typename Batch>
36 QOhosConsumer<std::function<
void()>> tasksExecutor, std::function<
void(Batch &&)> targetThreadHandleBatchFunc);
41 void postRequestTaskIfNeeded();
43 std::mutex m_batchMutex;
45 bool m_batchPending =
false;
46 QOhosConsumer<std::function<
void()>> m_tasksExecutor;
47 std::function<
void(Batch &&)> m_targetThreadHandleBatchFunc;
50template<
typename Batch>
52 QOhosConsumer<std::function<
void()>> tasksExecutor,
std::function<
void(Batch &&)> targetThreadHandleBatchFunc)
53 : m_tasksExecutor(tasksExecutor)
54 , m_targetThreadHandleBatchFunc(
std::move(targetThreadHandleBatchFunc))
58template<
typename Batch>
61 std::lock_guard<
std::mutex> requestLock(m_batchMutex);
65 if (!m_batchPending) {
69 auto self = weakSelf.lock();
71 std::unique_ptr<Batch> optRequest;
73 std::lock_guard<std::mutex> requestLock(self->m_batchMutex);
74 if (self->m_batchPending) {
75 optRequest = std::make_unique<Batch>(std::exchange(self->m_batch, Batch()));
76 self->m_batchPending =
false;
80 self->m_targetThreadHandleBatchFunc(std::move(*optRequest));
83 m_batchPending =
true;
89template<
typename Request>
91 QOhosConsumer<std::function<
void()>> tasksExecutor,
92 QOhosConsumer<Request &&> targetThreadBatchConsumer);
94template<
typename QtRequest>
96 QtOhos::QObjectThreadSafeRef qtContext,
std::function<
void(QtRequest &&)> qtHandleRequestFunc);
98template<
typename QtRequest>
100 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer);
102template<
typename Request>
104 QOhosConsumer<std::function<
void()>> tasksExecutor,
105 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer);
107template<
typename Request>
109 QOhosConsumer<std::function<
void()>> tasksExecutor,
110 QOhosConsumer<Request &&> targetThreadBatchConsumer)
114 std::move(tasksExecutor),
std::move(targetThreadBatchConsumer));
115 return [requestsHandler](
const std::function<
void(Request &)> &updateFunc) {
116 requestsHandler->updateBatch(updateFunc);
120template<
typename QtRequest>
122 QtOhos::QObjectThreadSafeRef qtContext,
std::function<
void(QtRequest &&)> qtHandleRequestFunc)
125 return makeQtOhosBatchingMTRequestsHandler(
126 makeQtThreadTasksExecutor(qtContext),
std::move(qtHandleRequestFunc));
129template<
typename QtRequest>
131 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer)
134 return makeQtOhosSimpleBatchingMTRequestsHandler(
135 makeQtThreadTasksExecutor(qtContext),
std::move(qtThreadBatchConsumer));
138template<
typename Request>
140 QOhosConsumer<std::function<
void()>> tasksExecutor,
141 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer)
144 auto baseRequestsHandler = std::make_shared<QtOhosBatchingAsyncMTRequestsHandler<std::vector<Request>>>(
145 std::move(tasksExecutor), std::move(targetThreadBatchConsumer));
146 return [baseRequestsHandler = std::move(baseRequestsHandler)](Request request) {
147 baseRequestsHandler->updateBatch(
148 [&](std::vector<Request> &batch) {
149 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