Add WFRepeaterTask

This commit is contained in:
XieHan
2022-08-02 21:02:55 +08:00
parent 1aa7422455
commit c694169c84
3 changed files with 72 additions and 3 deletions
+61 -1
View File
@@ -45,7 +45,7 @@ enum
WFT_STATE_SSL_ERROR = 65,
WFT_STATE_DNS_ERROR = 66, /* for client task only */
WFT_STATE_TASK_ERROR = 67,
WFT_STATE_ABORTED = CS_STATE_STOPPED /* main process terminated */
WFT_STATE_ABORTED = CS_STATE_STOPPED
};
template<class INPUT, class OUTPUT>
@@ -721,6 +721,66 @@ protected:
virtual ~WFGoTask() { }
};
class WFRepeaterTask : public WFGenericTask
{
public:
void set_create(std::function<SubTask *(WFRepeaterTask *)> create)
{
this->create = std::move(create);
}
void set_callback(std::function<void (WFRepeaterTask *)> callback)
{
this->callback = std::move(callback);
}
protected:
virtual void dispatch()
{
SubTask *task = this->create(this);
if (task)
{
series_of(this)->push_front(this);
series_of(this)->push_front(task);
}
else
this->state = WFT_STATE_SUCCESS;
this->subtask_done();
}
virtual SubTask *done()
{
SeriesWork *series = series_of(this);
if (this->state != WFT_STATE_UNDEFINED)
{
if (this->callback)
this->callback(this);
delete this;
}
return series->pop();
}
protected:
std::function<SubTask *(WFRepeaterTask *)> create;
std::function<void (WFRepeaterTask *)> callback;
public:
WFRepeaterTask(std::function<SubTask *(WFRepeaterTask *)>&& create,
std::function<void (WFRepeaterTask *)>&& cb) :
create(std::move(create)),
callback(std::move(cb))
{
}
protected:
virtual ~WFRepeaterTask() { }
};
class WFModuleTask : public ParallelTask, protected SeriesWork
{
public:
+9
View File
@@ -99,6 +99,9 @@ using WFEmptyTask = WFGenericTask;
using WFDynamicTask = WFGenericTask;
using dynamic_create_t = std::function<SubTask *(WFDynamicTask *)>;
using repeated_create_t = std::function<SubTask *(WFRepeaterTask *)>;
using repeater_callback_t = std::function<void (WFRepeaterTask *)>;
using module_callback_t = std::function<void (const WFModuleTask *)>;
class WFTaskFactory
@@ -289,6 +292,12 @@ public:
static WFDynamicTask *create_dynamic_task(dynamic_create_t create);
static WFRepeaterTask *create_repeater_task(repeated_create_t create,
repeater_callback_t callback)
{
return new WFRepeaterTask(std::move(create), std::move(callback));
}
public:
static WFModuleTask *create_module_task(SubTask *first,
module_callback_t callback)
+2 -2
View File
@@ -143,8 +143,8 @@ protected:
std::function<SubTask *(WFDynamicTask *)> create;
public:
__WFDynamicTask(std::function<SubTask *(WFDynamicTask *)>&& func) :
create(std::move(func))
__WFDynamicTask(std::function<SubTask *(WFDynamicTask *)>&& create) :
create(std::move(create))
{
}
};