ssRender引擎 Plugin实现数据更新和文件操作

概述

本次工程使用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(&currentTime);

创建线程

这里我们创建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中属性更新的顺序和文件写入内容……

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值