小白求助,应该如何写出一个优雅的线程蓝图?

St  K猫 St  K猫 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
说明:某码农在写UE4蓝图的过程中发生了一件神奇的事,在接受了一坨端口传输的数据之后,竟然悲催地不能编译!!!
代码如下(省略串口调用):
h:
UCLASS()
class MYPJT_API UmainBP : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, BlueprintPure, Category = Game)
static FString BodyTurn
(
FString& LX_uparm,
FString& LY_uparm,
FString& LZ_uparm,
FString& LZ_lowarm,
FString& LX_hand,
FString& LY_hand,
FString& RX_uparm,
FString& RY_uparm,
FString& RZ_uparm,
FString& RZ_lowarm,
FString& RX_hand,
FString& RY_hand
);
};

cpp:
String UmainBP::BodyTurn(
FString& LX_uparm,
FString& LY_uparm,
FString& LZ_uparm,
FString& LZ_lowarm,
FString& LX_hand,
FString& LY_hand,
FString& RX_uparm,
FString& RY_uparm,
FString& RZ_uparm,
FString& RZ_lowarm,
FString& RX_hand,
FString& RY_hand
)

{
int32_t wTempList[20] = { 0 }, i = 0;
HANDLE hCom1 = init_com("COM3");
char readBuf[1000] = { 0 }, bufTemp1[1024] = { 0 }, bufTemp2[1024] = { 0 };
DWORD readsize;
int n = 2;
string str = "";
int index = 0;
while (n--) {
ReadFile(hCom1, readBuf, 256, &readsize, NULL);
str += readBuf;
memset(readBuf, 0, sizeof(readBuf));
index = str.find('\n');
if (index < 0) {}
else if (index == 113)
{
string p = str.substr(0, index + 1);

if (p[0] == ':' && p[113] == '\n')
{
for (i = 0; i < 14; i++)
{
wTempList[i] = strtoul(p.substr(i * 8 + 1, 8).c_str(), NULL, 16);
}
uint32_t crcData = wTempList[13];
uint32_t crcRes = crc32_in_c(0, (uint8_t*)wTempList, 52);

}
index = 0;
float lz_uparm = 180*wTempList[1]/32768;
float ly_uparm = 180*wTempList[2]/32768;
float lx_uparm = 180*wTempList[3]/32768;
float lz_lowarm = 180*wTempList[4]/32768;
float lx_hand = 180*wTempList[5]/32768;
float ly_hand = 180*wTempList[6]/32768;
float rz_uparm = 180*wTempList[7]/32768;
float ry_uparm = 180*wTempList[8]/32768;
float rx_uparm = 180*wTempList[9]/32768;
float rz_lowarm = 180*wTempList[10]/32768;
float rx_hand = 180*wTempList[11]/32768;
float ry_hand = 180*wTempList[12]/32768;
LZ_uparm = FString::SanitizeFloat(lz_uparm);
LY_uparm = FString::SanitizeFloat(ly_uparm);
LX_uparm = FString::SanitizeFloat(lx_uparm);
LZ_lowarm = FString::SanitizeFloat(lz_lowarm);
LX_hand = FString::SanitizeFloat(lx_hand);
LY_hand = FString::SanitizeFloat(ly_hand);
RZ_uparm = FString::SanitizeFloat(rz_uparm);
RY_uparm = FString::SanitizeFloat(ry_uparm);
RX_uparm = FString::SanitizeFloat(rx_uparm);
RZ_lowarm = FString::SanitizeFloat(rz_lowarm);
RX_hand = FString::SanitizeFloat(rx_hand);
RY_hand = FString::SanitizeFloat(ry_hand);

}
else
{
str.erase(0, index + 1);
LZ_uparm = "0";
LY_uparm = "0";
LX_uparm = "0";
LZ_lowarm = "0";
LX_hand = "0";
LY_hand = "0";
RZ_uparm = "0";
RY_uparm = "0";
RX_uparm = "0";
RZ_lowarm = "0";
RX_hand = "0";
RY_hand = "0";

}
}
return "0";
}

于是在加载UE4,编译动画蓝图后,发生了以下悲剧:

求问诸位大神,这个不能运行由不报错的多线程安全该怎么破?
...全文

相关推荐

Python 蓝图

首先,我对蓝图的理解相对通俗,就是觉得蓝图对于视图方法模块化、大项目协同开发过程中的一个很好的工具. 1.下图是我们通常情况下使用的项目组织结构 看一下视图方法: #views.py 1 from app import app 2 3 4 @app.route('/user/index') 5 def index(): 6 return 'user_index' 7 8 @app.route('/user/show') 9 def show(): 10 return 'user_show' 11 12 @app.route('/user/add') 13 def add(): 14 return 'user_add' 15 16 @app.route('/admin/index') 17 def adminindex(): 18 return 'admin_index' 19 20 @app.route('/admin/show') 21 def adminshow(): 22 return 'admin_show' 23 24 @app.route('/admin/add') 25 def adminadd(): 26 return 'admin_add' #从视图方法中,我们看到有6个视图,分别对应admin,user两个不同用户的3个功能index,add,show. 这样写显然没问题,但是明显与python提倡的模块化,优雅的代码特点相违背,即不是很python的python代码. 让我们在这里假想两个问题: 1.如果admin和user不止只有3个功能呢,比如好几百个,导致views的代码量已经达到了上万行? 2.如果我们有多个同事分工开发admin,user和其它可能的模块呢,都同时往一个views里写代码吗,在做版本控制时,提交过程中频繁出现提交冲突了怎么办? 3.加入我们要抛弃admin或者user功能块时怎么办,要一一手动删除所有admin或是user相关的代码吗,这样当然可以,但是会不会太low呢? 当然根据Pythonic特点,我们肯定希望尽可能的把代码尽量的模块化,让我们的代码看起来更加的优雅和顺畅,这个时候flask.Blueprint(蓝图)就派上用场了 什么是蓝图? 一个蓝图定义了可用于单个应用的视图,模板,静态文件等等的集合。 我什么时候会用到蓝图? 蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,user相关的视图方法分为两个组件,一个是admin组件,一个是user组件.这时我们可以 创建两个蓝图实现这两个独立的组件. 2.我们如何使用蓝本将上述的视图方法看上去更加pythonic呢? 由于上面的例子中只有两个组件(模块)admin,user,我们可以创建名为admin.py和user.py的两个文件,分别在里面创建两个蓝图的实例对象admin,user. 直接上代码: #admin.py #admin.py from flask import Blueprint,render_template, request admin = Blueprint('admin',__name__) @admin.route('/index') def index(): return render_template('admin/index.html') @admin.route('/add') def add(): return 'admin_add' @admin.route('/show') def show(): return 'admin_show' #要想创建一个蓝图对象,你需要import flask. Blueprint() 类并用参数 name 和 import_name 初始化。import_name通常用 __name__ ,一个表示当前模块的特殊的Python变量,作为 import_name 的取值。 #user.py from flask import Blueprint, render_template, redirect user = Blueprint('user',__name__) @user.route('/index') def index(): return render_template('user/index.html') @user.route('/add') def add(): return 'user_add' @user.route('/show') def show(): return 'user_show' 好了,视图函数已经分开了,我们如何使用它们的呢?再来看一下我们的views.py变成了什么样吧? #views.py from app import app from .admin import admin from .user import user #这里分别给app注册了两个蓝图admin,user #参数url_prefix='/xxx'的意思是设置request.url中的url前缀, #即当request.url是以/admin或者/user的情况下才会通过注册的蓝图的视图方法处理请求并返回 app.register_blueprint(admin,url_prefix='/admin') app.register_blueprint(user, url_prefix='/user') #现在我们的views是否已经变得很简单了呢?顺便回答第三个问题,如果想弃用某一个组件(模块)我们只需要相对应的注释掉给app注册蓝图的行即可. #细心的伙伴还可以发现,在views.py中在使用默认endpoint的前提下,我们是没有办法使用同一个视图方法名的(当然我们也不建议在同一个文件中有两个视图方法名相同, #尽管指向他们的request.url不同),但是使用了蓝图之后我们就可以在不同模块中使用相同的方法名了,例如add,show.. 3.到此我们就可以通过浏览器测试我们的程序 4.附上使用蓝图后的项目组织结构 当然如果项目不大的话就没有什么必要使用蓝图了,甚至我们可以把除了所有css,js,html的代码都写到一个文件中去,这里我们不在举例,说明.

ZZ邱

UE蓝图加载关卡带loading页[源码]

本文介绍了使用Unreal Engine(UE)蓝图加载关卡并实现loading页面的方法。通过蓝图的运用,开发者可以在关卡加载过程中展示loading图,提升用户体验。文章简要记录了实现这一功能的关键步骤,为UE开发者提供了实用的技术参考。

代码浣熊

Fakebook-Day2:在第2天之后,在完善蓝图功能之前

假书

罗志鹏铂涛全品牌投发

Flask-LazyViews:以惰性方式注册Flask应用程序或蓝图的URL路由

Flask-LazyViews:以惰性方式注册Flask应用程序或蓝图的URL路由

李念遠

数据仓库系列:如何优雅地规划数仓体系

数仓规划是数仓建设的蓝图,涵盖从需求分析开始到最终的数仓评估验收整个环境;数仓规划之所以重要,是因为它是描述了数据流动的概念性框架,为元数据管理奠定了基础,对数据加工过程的理解、数仓建设的交流分享、数据的使用和问题排查、数仓健康度的评估都提供了极大的帮助。需要强调的是本节是从宏观上描述数仓的框架,具体到数据模型的细节对比、存储选型和管理、接入数据源管理等数仓建设的周边在本节不涉及。通过本节的阅读,你将了解到以下知识:从业务矩阵的设计(宏观、微观)、横向的分层、纵向的分线到主题划分等角度解构数仓

weixin_38724247
评论
收藏 已收藏
分享
返回顶部