概述
本次工程使用Plugin实现数据更新和文件操作,通过Plugin_Switch属性控制Plugin功能开关。
Sleep属性控制属性更新速度
I_X_Y_Z、F_Scale属性根据更新速度自动更新自身数值(自身范围内随机变化数值)
当I_X_Y_Z、F_Scale属性更新时,向文件“Log.txt”写入,“属性执行成功!”。
当Project窗口中删除当前Plugin或程序退出时,向文件“Log.txt”写入,“文件关闭,停止写入!”。
进行写入文件操作时,将当前时间同时添加到文件中。
效果
创建属性
SSR_PLUGIN_PROPERTY_DEF_BEGIN(UserPluginDLL) //定义属性开始
SSR_PLUGIN_PROPERTY("Integer", "I_X_Y_Z", TYPE_INT, "0", -32768, 32767, "Integer", PCT_TextBoxBind) //X Y Z
//SSR_PLUGIN_PROPERTY("Integer", "I_Width_Height ", TYPE_INT, "0", 0, 65535, "Integer", PCT_TextBoxBind) //Width Height[TBD] 0706
SSR_PLUGIN_PROPERTY("Float", "F_Scale", TYPE_FLOAT, "0.00", 0.00, 100.00, "Float", PCT_TextBoxBind) //Scale[TBD] 0706
//SSR_PLUGIN_PROPERTY("Float", "F_Opacity", TYPE_FLOAT, "0", 0.00, 1.00, "Float", PCT_TextBoxBind) //Opacity[TBD] 0706
//SSR_PLUGIN_PROPERTY("Bool", "B_Visible", TYPE_BOOL, "0", 0, 1, "Bool", PCT_CheckBox) //Visible Bool[TBD] 0706
SSR_PLUGIN_PROPERTY("Switch", "Plugin_switch", TYPE_INT, "0", 0, 1, "Plugin_switch", PCT_CheckBox) //SumSwitch:Plugin全体属性的功能开关
SSR_PLUGIN_PROPERTY("Integer", "Sleep", TYPE_INT, "1000", 0, 10000, "Integer", PCT_TextBoxBind) //控制属性执行延迟时间
SSR_PLUGIN_PROPERTY_DEF_END() //定义属性结束
//可以多次调用SSR_PLUGIN_PLUGIN_PROPERTY()创建不同的属性
SSR_PLUGIN_EVENT_DEF_BEGIN()
SSR_PLUGIN_EVENT("test")
SSR_PLUGIN_EVENT_DEF_END()
FILE * LogText;
int ret;
pthread_t updateData_thread;
int SleepNumber = 0;
char timeString[100];
time_t currentTime = time(NULL);
struct tm *localTime = localtime(¤tTime);
创建线程
这里我们创建1个线程,用于更新数据
使用fopen 准备开始文件操作,向Log.txt文件中写入LOG信息,使用a+模式
ret = pthread_create(&updateData_thread, NULL, updateData, (void *)ssrObj);
LogText = fopen("Log.txt", "a+"); //文件操作开始_2
同时进行判断是否创建成功
if (ret != 0) {
fputs(timeString, LogText);
return NULL;
}
if (LogText == NULL) {
fputs(timeString, LogText);
Common::printlog(LOG_LEV_ERROR, "文件打开失败,无法写入! \n");
return NULL;
}
同时当我们删除Plugin节点时,记录当前操作,写入到文件中
void UserPluginDLL::deleteSSRObject(SSRObject* ssrObject)
{
if (ssrObject) {
fputs(timeString, LogText);
fputs("文件关闭,停止写入!\n", LogText);
fputs("Project窗口删除Plugin!\n", LogText);
fclose(LogText);
LogText = NULL;
delete ssrObject;
ssrObject = NULL;
pthread_join(updateData_thread, NULL);
}
}
下面我们实现具体操作
1.timeString获取当前时间,写入文件中
2.fflush 更新缓冲区,直接写入文件中;fseek设置文件指针,在文件末尾追加内容
3.使用随机值更新属性
SSRObject* ssrObject = (SSRObject*)arg;
UserPluginDLL* dataSource = (UserPluginDLL*)ssrObject->m_ssRptr_plugin;
Common::printlog(LOG_LEV_ERROR, "成功加载! \n");
while (1) {
int ret = Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Plugin_switch"));
int MaxValue = 32767;
int MinValue = -32768;
while (ret == 1) {
int random_num = rand() % 65535 - 32768;
double random_double_num = ((double)rand() / RAND_MAX) * 100.00;
strftime(dataSource->timeString, sizeof(dataSource->timeString), "[%Y-%m-%d %H:%M:%S][ssR_Log] ", dataSource->localTime);
//更新I_X_Y_Z属性[待优化]
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "I_X_Y_Z", Common::int2str(MaxValue)); //最大值
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "F_Scale", Common::float2str(100.00)); //最大值
Sleep(Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Sleep")));
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "I_X_Y_Z", Common::int2str(32766)); //最大边界值
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "F_Scale", Common::float2str(99.00)); //最大边界值
Sleep(Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Sleep")));
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "I_X_Y_Z", Common::int2str(random_num));//随机值
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "F_Scale", Common::float2str(random_double_num));//随机值
Sleep(Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Sleep")));
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "I_X_Y_Z", Common::int2str(-32767));//最小值边界值
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "F_Scale", Common::float2str(1.00));//最小值边界值
Sleep(Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Sleep")));
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "I_X_Y_Z", Common::int2str(MinValue));//最小值
dataSource->m_renderEngine->getPropertySystem()->setPropertyValue(ssrObject, "F_Scale", Common::float2str(0.00));//最小值
Sleep(Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Sleep")));
fseek(dataSource->LogText, 0, SEEK_END);
fputs(dataSource->timeString, dataSource->LogText);
fputs("I_X_Y_Z属性执行成功! \n", dataSource->LogText);
fputs("F_Scale属性执行成功! \n", dataSource->LogText);
Common::printlog(LOG_LEV_ERROR, "成功加载! \n");
fflush(dataSource->LogText);
break;
}
Sleep(Common::str2int(dataSource->m_renderEngine->getPropertySystem()->getPropertyValue(ssrObject, "Sleep")));
}
return ssrObject;
编译并使用Plugin
具体操作,跳转文章:ssRender引擎 Plugin实现生产者消费者模型
小结:
需要注意的是,编译前一定要思考如何实现,和实现想要的效果具体需要做哪些操作并理清顺序和概念。
有时候浪费时间较多的地方网网是一些执行顺序和规范上,这里需要注意。
本次工程会继续完善,下篇文章主要优化Plugin中属性更新的顺序和文件写入内容……