Modified the way content passed between connectors, now content is passed via "Package" && Improved the execution flow of MSG_Input_Node && Fixed the workflow execution.
This commit is contained in:
parent
3ec4327d45
commit
68fba7efd5
@ -6,6 +6,7 @@
|
|||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "imnodes.h"
|
#include "imnodes.h"
|
||||||
#include "ID_Generator.hpp"
|
#include "ID_Generator.hpp"
|
||||||
|
#include "DLT_Utilities.hpp"
|
||||||
#include "Json_Utilities.hpp"
|
#include "Json_Utilities.hpp"
|
||||||
|
|
||||||
// =====================================接口抽象======================================================
|
// =====================================接口抽象======================================================
|
||||||
@ -20,6 +21,14 @@ public:
|
|||||||
CONNECTOR_TYPE_INPUT, // 输入
|
CONNECTOR_TYPE_INPUT, // 输入
|
||||||
} Connector_Type_Enum; // 接口类型枚举
|
} Connector_Type_Enum; // 接口类型枚举
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t package_count = 0; // 包计数 (常规非0)
|
||||||
|
size_t total_count = 0; // 总计数 (常规非0,不定长包时为0)
|
||||||
|
void *p_content_mem = nullptr; // 包存储
|
||||||
|
size_t content_size = 0; // 包大小
|
||||||
|
} Package; // 接口包定义
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// ID 分配器
|
// ID 分配器
|
||||||
Independent_ID_Generator *ID_Generator;
|
Independent_ID_Generator *ID_Generator;
|
||||||
@ -29,7 +38,7 @@ protected:
|
|||||||
const char *socket_str; // 套接字字符串
|
const char *socket_str; // 套接字字符串
|
||||||
|
|
||||||
std::vector<Abs_Connector *> related_connector_list; // 关联列表
|
std::vector<Abs_Connector *> related_connector_list; // 关联列表
|
||||||
void *product; // 产物(仅输出类节点持有)
|
Package pkg; // 接口包(仅输出类节点持有)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 显式禁用默认构造
|
// 显式禁用默认构造
|
||||||
@ -50,15 +59,21 @@ public:
|
|||||||
// 与指定的接口断开连接
|
// 与指定的接口断开连接
|
||||||
virtual bool Disconnect_To(Abs_Connector *target);
|
virtual bool Disconnect_To(Abs_Connector *target);
|
||||||
|
|
||||||
// 注册产物
|
/**
|
||||||
virtual bool Register_Product(void *product, size_t size);
|
* 注册包
|
||||||
|
* @param p_content 目标容物指针
|
||||||
|
* @param content_size 容物大小
|
||||||
|
* @param count 当前包位置
|
||||||
|
* @param total_count 包流总长度
|
||||||
|
*/
|
||||||
|
virtual bool Register_Package(void *p_content, size_t content_size, size_t count, size_t total_count);
|
||||||
|
|
||||||
|
// 获取包
|
||||||
|
virtual const Package Get_Package(void);
|
||||||
|
|
||||||
// 获取关联接口列表
|
// 获取关联接口列表
|
||||||
virtual std::vector<Abs_Connector *> Get_Related_List(void);
|
virtual std::vector<Abs_Connector *> Get_Related_List(void);
|
||||||
|
|
||||||
// 获取产物
|
|
||||||
virtual void *Get_Product(void);
|
|
||||||
|
|
||||||
// 获取ID
|
// 获取ID
|
||||||
virtual int Get_ID(void);
|
virtual int Get_ID(void);
|
||||||
|
|
||||||
@ -222,7 +237,20 @@ class MSG_Input_Node : public Abs_Node
|
|||||||
private:
|
private:
|
||||||
float node_width = 0;
|
float node_width = 0;
|
||||||
|
|
||||||
|
DLT_Log log;
|
||||||
|
|
||||||
|
// 执行相关
|
||||||
|
bool excute_flag = false;
|
||||||
|
size_t private_excute_count = 0;
|
||||||
|
size_t private_excute_end_count = 0;
|
||||||
|
bool private_finish_flag = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
// 只读引用
|
||||||
|
const bool &finish_flag = this->private_finish_flag;
|
||||||
|
const size_t &excute_count = this->private_excute_count;
|
||||||
|
const size_t &excute_end_count = this->private_excute_end_count;
|
||||||
|
|
||||||
// 显式禁用默认构造
|
// 显式禁用默认构造
|
||||||
MSG_Input_Node() = delete;
|
MSG_Input_Node() = delete;
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
#include "Nodes_And_Connectors.hpp"
|
#include "Nodes_And_Connectors.hpp"
|
||||||
#include "Json_Utilities.hpp"
|
#include "Json_Utilities.hpp"
|
||||||
#include "imgui_internal.h"
|
#include "imgui_internal.h"
|
||||||
|
#include "Global_Variables.hpp"
|
||||||
|
#include "DLT_Utilities.hpp"
|
||||||
|
|
||||||
// 客制化圆形带X按钮
|
// 客制化圆形带X按钮
|
||||||
bool CircleButtonWithX(const char *id, float radius)
|
bool CircleButtonWithX(const char *id, float radius)
|
||||||
@ -75,17 +77,14 @@ Abs_Connector::Abs_Connector(Independent_ID_Generator *ID_Generator,
|
|||||||
this->type = type;
|
this->type = type;
|
||||||
this->socket_str = socket_str;
|
this->socket_str = socket_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 指针初始化
|
|
||||||
this->product = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 析构
|
// 析构
|
||||||
Abs_Connector::~Abs_Connector()
|
Abs_Connector::~Abs_Connector()
|
||||||
{
|
{
|
||||||
// 释放产物
|
// 释放产物
|
||||||
if (this->product != nullptr)
|
if (this->pkg.p_content_mem != nullptr)
|
||||||
free(product);
|
free(this->pkg.p_content_mem);
|
||||||
// 断开所有连接
|
// 断开所有连接
|
||||||
this->Disconnect_All();
|
this->Disconnect_All();
|
||||||
// 释放ID
|
// 释放ID
|
||||||
@ -155,24 +154,41 @@ bool Abs_Connector::Disconnect_To(Abs_Connector *target)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册产物
|
/**
|
||||||
bool Abs_Connector::Register_Product(void *product, size_t size)
|
* 注册包
|
||||||
|
* @param p_content 目标容物指针
|
||||||
|
* @param content_size 容物大小
|
||||||
|
* @param count 当前包位置
|
||||||
|
* @param total_count 包流总长度
|
||||||
|
*/
|
||||||
|
bool Abs_Connector::Register_Package(void *p_content, size_t content_size, size_t count, size_t total_count)
|
||||||
{
|
{
|
||||||
// 非输出类接口
|
// 非输出类接口
|
||||||
if (this->type != CONNECTOR_TYPE_OUTPUT)
|
if (this->type != CONNECTOR_TYPE_OUTPUT)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// 释放之前的产物
|
// 释放之前的产物
|
||||||
if (this->product != nullptr)
|
if (this->pkg.p_content_mem != nullptr)
|
||||||
free(this->product);
|
free(this->pkg.p_content_mem);
|
||||||
|
|
||||||
// 分配空间
|
// 分配空间
|
||||||
this->product = malloc(size);
|
if (content_size > 0)
|
||||||
if (this->product == nullptr)
|
{
|
||||||
|
this->pkg.p_content_mem = malloc(content_size);
|
||||||
|
if (this->pkg.p_content_mem == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// 复制内容
|
// 复制内容
|
||||||
memcpy(this->product, product, size);
|
memcpy(this->pkg.p_content_mem, p_content, content_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this->pkg.p_content_mem = nullptr;
|
||||||
|
|
||||||
|
// 包信息
|
||||||
|
this->pkg.package_count = count;
|
||||||
|
this->pkg.total_count = total_count;
|
||||||
|
this->pkg.content_size = content_size;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,14 +199,14 @@ std::vector<Abs_Connector *> Abs_Connector::Get_Related_List(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取产物
|
// 获取产物
|
||||||
void *Abs_Connector::Get_Product(void)
|
const Abs_Connector::Package Abs_Connector::Get_Package(void)
|
||||||
{
|
{
|
||||||
// 输出节点返回直接产物
|
// 输出节点返回直接产物
|
||||||
if (this->type == CONNECTOR_TYPE_OUTPUT)
|
if (this->type == CONNECTOR_TYPE_OUTPUT)
|
||||||
return this->product;
|
return this->pkg;
|
||||||
|
|
||||||
// 其它情况返回空值
|
// 其它情况返回空值
|
||||||
return nullptr;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取ID
|
// 获取ID
|
||||||
@ -487,7 +503,7 @@ MSG_Input_Node::MSG_Input_Node(Independent_ID_Generator *Node_ID_Generator,
|
|||||||
if (this->id != -1)
|
if (this->id != -1)
|
||||||
{
|
{
|
||||||
// 消息输出节点
|
// 消息输出节点
|
||||||
this->Connector_List.push_back(std::make_shared<MSG_OutPut_Connector>(Connector_ID_Generator));
|
this->Connector_List.push_back(std::make_shared<MSG_OutPut_Connector>(Connector_ID_Generator)); // [0] -> MSG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,5 +604,75 @@ void MSG_Input_Node::Show(void)
|
|||||||
// 执行处理流程
|
// 执行处理流程
|
||||||
bool MSG_Input_Node::Execute_Process(void)
|
bool MSG_Input_Node::Execute_Process(void)
|
||||||
{
|
{
|
||||||
|
// 未开始执行时
|
||||||
|
if (this->excute_flag == false)
|
||||||
|
{
|
||||||
|
private_finish_flag = false;
|
||||||
|
|
||||||
|
// 错误信息
|
||||||
|
std::string err_str;
|
||||||
|
const char *err_filename_str = nullptr;
|
||||||
|
|
||||||
|
// 循环加载文件
|
||||||
|
Input_File_Node *p_file_list = input_dlt_file_list_head;
|
||||||
|
while (p_file_list != nullptr)
|
||||||
|
{
|
||||||
|
err_str = this->log.Load_From_File(p_file_list->file_name_str);
|
||||||
|
if (!err_str.empty())
|
||||||
|
{
|
||||||
|
err_filename_str = p_file_list->file_name_str;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p_file_list = p_file_list->p_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输出错误信息
|
||||||
|
if (!err_str.empty())
|
||||||
|
{
|
||||||
|
// 工具Lambda string 转 wstring
|
||||||
|
auto Lambda_String_To_WString = [](const std::string &str) -> std::wstring
|
||||||
|
{
|
||||||
|
if (str.empty())
|
||||||
|
return std::wstring();
|
||||||
|
int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), nullptr, 0);
|
||||||
|
if (len <= 0)
|
||||||
|
return std::wstring();
|
||||||
|
std::wstring wstr(len, L'\0');
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), &wstr[0], len);
|
||||||
|
return wstr;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 输出错误信息
|
||||||
|
MessageBoxW(Main_Window_hWnd, (L"文件\"" + Lambda_String_To_WString(std::string(err_filename_str)) + L"\"读取失败\n" + Lambda_String_To_WString(err_str)).c_str(), L"", MB_OK | MB_ICONERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 排序后消息处理
|
||||||
|
this->log.Sort();
|
||||||
|
this->excute_flag = true;
|
||||||
|
this->private_excute_end_count = this->log.msg_list.size();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 注册接口包,执行期间不可以释放log,否则传入的产物中vector会虚空索引
|
||||||
|
if (this->private_excute_count < this->private_excute_end_count)
|
||||||
|
{
|
||||||
|
// [0] -> MSG
|
||||||
|
this->Connector_List[0]->Register_Package((void *)&(this->log.msg_list[this->private_excute_count]),
|
||||||
|
sizeof(this->log.msg_list[0]),
|
||||||
|
this->private_excute_count + 1,
|
||||||
|
this->excute_end_count);
|
||||||
|
this->private_excute_count++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->log.Clear();
|
||||||
|
this->excute_flag = false;
|
||||||
|
this->private_excute_count = 0;
|
||||||
|
this->private_excute_end_count = 0;
|
||||||
|
this->private_finish_flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -672,17 +672,18 @@ bool Workflow_Editor::Execute_Workflow(void)
|
|||||||
* @todo 线程分离
|
* @todo 线程分离
|
||||||
* 将任务单独分离到线程中,并跟随进度条
|
* 将任务单独分离到线程中,并跟随进度条
|
||||||
*/
|
*/
|
||||||
|
if (this->Build_Process_Route() == false)
|
||||||
bool status = this->Build_Process_Route();
|
|
||||||
if (status == false)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
for (auto Route : this->Process_Route)
|
|
||||||
for (auto pNode : Route)
|
|
||||||
{
|
|
||||||
status = pNode->Execute_Process();
|
|
||||||
if (status == false)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// 循环执行工作流
|
||||||
|
for (auto Route : this->Process_Route)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
for (auto pNode : Route)
|
||||||
|
if (pNode->Execute_Process() == false)
|
||||||
|
return false;
|
||||||
|
} while (!((MSG_Input_Node *)(&(*Route[0])))->finish_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user