selector之fd_set

本文详细介绍了select机制的基本原理和使用方法,包括fd_set数据结构及其操作宏,select函数的参数和返回值解释,并提供了示例代码。适用于多路复用I/O场景。

select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fe_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。

多端口复用函数select在调用前要首先设置监听的端口数目,FD_ZERO是清空端口集,FD_SET是设置端口集。

select()函数常常用在用一个进程监听多个服务器端socket。

有时,select()也被当作延时函数使用。sleep()延时会释放CPU,select()的话,可以在占用CPU的情况下延时。

select()函数主要是建立在fd_set类型的基础上的。fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:

fd_set  set;

FD_ZERO(&set);        /*将set清零使集合中不含任何fd*/

FD_SET(fd, &set);      /*将fd加入set集合*/

FD_CLR(fd, &set);      /*将fd从set集合中清除*/

FD_ISSET(fd, &set);   /*测试fd是否在set集合中*/

过去,一个fd_set通常只能包含<32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd; 现在,UNIX系统通常会在头文件<sys/select.h>中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示<1024的fd。根据fd_set的位矢量实现,我们可以重新理解操作fd_set的四个宏:

fd_set  set;

FD_ZERO(&set);        /*将set的所有位置0,如set在内存中占8位则将set置为00000000*/

FD_SET(0, &set);       /*将set的第0位置1,如set原来是00000000,则现在变为100000000,这样fd==1的文件描述字就被加进set中了*/

FD_CLR(4, &set);       /*将set的第4位置0,如set原来是10001000,则现在变为10000000,这样fd==4的文件描述字就被从set中清除了*/

FD_ISSET(5, &set);     /*测试set的第5位是否为1,如果原来set是10000100,则返回非零,表明fd==5的文件描述符在set中,否则返回0*/

注意:fd的最大值必须<FD_SETSIZE。

select函数的接口比较简单:

int select(int nfds,  fd_set* readset,  fd_set* writeset,  fe_set* exceptset,  struct timeval* timeout);

功能:

测试指定的fd可读?可写?有异常条件待处理?

参数:

nfds: 需要检查的文件描述字个数(即检查到fd_set的第几位),数值应该比三组fd_set中所含的最大fd值更大,一般设为三组fd_set中所含的最大fd值加1(如在readset, writeset, exceptset中所含最大的fd为5,则nfds=6,因为fd是从0开始的 )。设这个值是为了提高效率,使函数不必检查fd_set的所有1024位。

readset: 用来检查可读性的一组文件描述字。

writeset: 用来检查可写性的一组文件描述字。

exceptset: 用来检查是否有异常条件出现的文件描述字。(注:错误不包括在异常条件之内)

timeout: 有三种可能:

1.  timeout = NULL (阻塞:直到有一个fd位被置为1函数才返回)

2.  timeout所指向的结构设为非零时间(等待固定时间:有一个fd位被置为1或者时间耗尽,函数均返回)

3.  timeout所指向的结构,时间设为0(非阻塞:函数检查完每一个fd后立即返回)

返回值:返回对应位仍然为1的fd的总数。

Remark:

三组fd_set均将某些fd位置0,只有那些可读,可写以及有异常条件待处理的fd位仍然为1。

使用select函数的过程一般是:

先调用宏FD_ZERO将指定的fd_set清零,然后调用宏FD_SET将需要测试的fd加入fd_set,接着调用函数select测试fd_set中的所有fd,最后用宏FD_ISSET检查某个fd在函数select调用后,相应位是否仍然为1。

以下是一个测试单个文件描述字可读性的例子:

int  isready(int  fd)

{
    int    rc;

    fd_set    fds;

    struct timeval    tv;

    FD_ZERO(&fds);

    FD_SET(fd,  &fds);

    tv.tv_sec = tv.tv_usec = 0;

    rc = select(fd+1, &fds, NULL, NULL, &tv);

    if( rc<0 )  //error

      return -1;

    return FD_ISSET(fd, &fds)  ? 1: 0;

}

下面还有一个复杂一些的应用:

//这段代码将指定测试Socket的描述字的可读可写性,因为Socket使用的也是fd

unit32  SocketWait(TSocket* s,  bool rd,  bool wr,  unit32 timems)

{
    fd_set  rfds, wfds;

 #ifdef _WIN32

    TIMEVAL tv;

#else

    struct timeval   tv;

#endif    /*_WIN32*/

    FD_ZERO(&rfds);

    FD_ZERO(&wfds);

    if(rd)    //TRUE

      FD_SET(*s, &rfds);  //添加要测试的描述字

    if(wr)

      FD_SET(*s, &wfds);

    tv.tv_sec = timems/1000;  //seconds

    tv.tv_usec = timems%1000;  //ms

    for(;;)  //如果errno==EINTR,反复测试缓冲区的可读性

      switch(select((*s)+1, &fds, &wfds, NULL, (timems==TIME_INFINITE?NULL:&tv)))  //测试在规定的时间内套接字接口接收缓冲区是否有数据可读

      {
           // 0——超时,  -1——出错

           case 0:  /*time out*/

               return 0;

           case (-1):    /*socket error*/

              if( SocketError()==EINTR )

                 break;

              return 0;  //有错但不是EINTR

           default:

              if(FD_ISSET(*s, &rfds))  //如果s是fds中的一员返回非0,否则返回0

                 return 1;

              if(FD_ISSET(*s, &wfds))

                 rerun  2;

              return 0;

      };

}
帮我在这个修改信息页面 增加一个 性别 字段叫sex , 1男 2女 的单选框 默认选择男就行 然后提交给接口 <template> <view :style="themeColor"> <view class="page"> <view class="flex benben-position-layout flex flex-wrap align-center user_flex_0" :style="{height:(88+StatusBarRpx)+'rpx',paddingTop:StatusBarRpx+'rpx', }"> <view class='flex flex-wrap align-center justify-between flex-sub user_fd0_0'> <view class='flex flex-wrap align-center' @tap.stop="handleJumpDiy" data-type="back" data-url="1"> <text class='fu-iconfont2 user_fd0_0_c0_c0' @tap.stop="handleJumpDiy" data-type="back" data-url="1"></text> </view> <view class='flex flex-wrap align-stretch justify-center flex-sub'> <text class='user_fd0_0_c1_c0'>交友信息</text> </view> <view class='flex flex-wrap align-center user_fd0_0_c2'> </view> </view> </view> <view :style="{height: (88+StatusBarRpx)+'rpx'}"></view> <view class="flex flex-direction flex-wrap align-stretch user_flex_1"> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>头像</text> <view class="upload position-relative"> <image class=" user_fd1_0_c1_image" mode="aspectFit" @tap="openCheck" :src="userInfo.f_head_img ? userInfo.f_head_img : STATIC_URL+'94.png'"></image> </view> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>昵称</text> <input class='flex-sub user_fd1_1_c1' type="text" :placeholder="`请输入昵称`" confirm-type="done" :maxlength="7" placeholder-style="color:rgba(102, 102, 102, 1);font-size:32rpx" v-model="userInfo.f_nickname" /> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0' style="position: relative;"> <text class='user_fd1_0_c0'>交友宣言</text> <textarea class='flex improveInformation_input_fd3_2_c10_c1' style="height: 100px; height: 120px; width: 100%; border-radius: 8px; padding: 10px; margin: 10px 0px; border: 1px solid #eeeeee; padding-bottom: 30px;" @input="descInput" v-model="userInfo.autograph" :placeholder="'请输入'" :maxlength="max_txt_num" placeholder-style="color:rgba(191, 191, 191, 1);font-size:32rpx" /> <span style="color:#999; position: absolute; bottom: 29px; right: 8px;font-size: 12px;">{{remnant}}/{{max_txt_num}}</span> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>身高/cm</text> <input class='flex-sub user_fd1_1_c1' type="number" :placeholder="`请输入身高`" confirm-type="done" :maxlength="3" placeholder-style="color:rgba(102, 102, 102, 1);font-size:32rpx" v-model="userInfo.f_height" /> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>体重/kg</text> <input class='flex-sub user_fd1_1_c1' type="number" :placeholder="`请输入体重`" confirm-type="done" :maxlength="3" placeholder-style="color:rgba(102, 102, 102, 1);font-size:32rpx" v-model="userInfo.f_weight" /> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>学历</text> <input class='flex-sub user_fd1_1_c1' type="text" :placeholder="`请输入学历`" confirm-type="done" :maxlength="7" placeholder-style="color:rgba(102, 102, 102, 1);font-size:32rpx" v-model="userInfo.f_xueli" /> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0' @tap.stop="danshenpop=true"> <text class='user_fd1_0_c0'>情感状态</text> <view class='flex flex-wrap align-center'> <text class='user_fd1_2_c1_c0'></text> <text class='user_fd1_1_c1' v-if="userInfo.f_qinggan=='0'">请选择</text> <text class='user_fd1_1_c1' v-if="userInfo.f_qinggan=='1'">单身中</text> <text class='user_fd1_1_c1' v-if="userInfo.f_qinggan=='2'">恋爱中</text> <text class='fu-iconfont2 user_fd1_1_c2'></text> </view> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>职业</text> <input class='flex-sub user_fd1_1_c1' type="text" :placeholder="`请输入职业`" confirm-type="done" :maxlength="10" placeholder-style="color:rgba(102, 102, 102, 1);font-size:32rpx" v-model="userInfo.f_zhiye" /> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>个人标签 <text style="font-size: 12px;margin-left: 15px;">已选择{{selectedCount}}/10 </text></text> <benben-select-diy ref="showSelectPopup1698223228571" class-name='flex flex-wrap flex' :items.sync="userInfo.f_label_list_arr" v-model="userInfo.f_label_list" default-type="id" default-label="name" :allow-cancel='true' :max-select="10" type="checkbox" :disabled='false' style=" padding: 10px; margin: 10px; border-radius: 6px;border: 1px solid #eeeeee;"> <template v-for='(item,key0) in userInfo.f_label_list_arr'> <view v-if="item.isSelected" class='flex flex labelSelection_fd1_0_c1_c0_c0' :key="key0" @tap="$refs.showSelectPopup1698223228571.tapHandle(key0)"> <text class='labelSelection_fd1_0_c1_c0_c0_c0'>{{item.name}}</text> </view> <view v-else class='flex flex labelSelection_fd1_0_c1_c0_c1' :key="key0" @tap="$refs.showSelectPopup1698223228571.tapHandle(key0)"> <text class='labelSelection_fd1_0_c1_c0_c1_c0'>{{item.name}}</text> </view> </template></benben-select-diy> </view> <view class='flex flex-wrap align-center justify-between user_fd1_0'> <text class='user_fd1_0_c0'>相册</text> <benben-images-upload ref="benbenImagesUploadfd1_0_c1" :maxlength="9" :imgList.sync="userInfo.f_images_bak" :imgIds.sync="userInfo.f_images_ids" style="padding: 9px; border: 1px solid #eeeeee; margin: 10px; border-radius: 6px;"> <template v-slot="{ num, maxlength, isShow, imgList }"> <view class="flex flex-wrap align-center self-center flex"> <view v-for="(image, index) in imgList" :key="index" class='flex position-relative publish_fd1_0_c10'> <text class='fu-iconfont2 position-absolute publish_fd1_0_c100' @tap.stop="$refs.benbenImagesUploadfd1_0_c1.delImage(index)"></text> <image class='publish_fd1_0_c101' @tap.stop="$refs.benbenImagesUploadfd1_0_c1.previewImage(index)" mode="aspectFill" :src='image'></image> </view> <image class='publish_fd1_0_c11' @tap.stop="openCheck2" v-if="isShow" mode="aspectFit" :src='STATIC_URL+"120.png"'></image> <text class='image_upload_tips publish_fd1_0_c12'>图片最多可上传9张</text> </view> </template> </benben-images-upload> </view> <view class="" style="height: 100rpx;"> </view> <button class='user_fd1_4' @tap.stop="setUserInfoFunc()">保存</button> </view> <benben-picker ref="benbenWritePickerCodepicker2" :visible.sync="danshenpop" :value.sync='userInfo.f_qinggan' :options='qinggan_options' mode='selector' :mask-show='true' :timeout='true' :picker-height='88' default-type='value' :default-props='{"label":"name","value":"value"}'> <template #picker-header> <view class='flex flex-wrap align-center justify-between user_picker2_0'> <text class='user_picker2_0_c0' @tap="$refs.benbenWritePickerCodepicker2.cancel()">取消</text> <text class='user_picker2_0_c1'>选择情感状态</text> <text class='user_picker2_0_c2' @tap="$refs.benbenWritePickerCodepicker2.pickerConfirm()">确认</text> </view> </template> </benben-picker> <benben-picker ref="benbenWritePickerCodepicker3" :visible.sync="birthdaypop" :value.sync='userInfo.birthday' mode='date' :picker-height='88' :current='true' :mask-show='true' fields='day' :timeout='true' start-year='1920-01-01' end-year='现在'> <template #picker-header> <view class='flex flex-wrap align-center justify-between user_picker3_0'> <text class='user_picker3_0_c0' @tap="$refs.benbenWritePickerCodepicker3.cancel()">取消</text> <text class='user_picker3_0_c1'>选择生日</text> <text class='user_picker3_0_c2' @tap="$refs.benbenWritePickerCodepicker3.pickerConfirm()">确认</text> </view> </template> </benben-picker> <yk-authpup ref="authpup" type="top" @changeAuth="changeAuth" permissionID="CAMERA"></yk-authpup> <yk-authpup ref="authpup_xiangce" type="top" @changeAuth="changeAuthXiangce" permissionID="WRITE_EXTERNAL_STORAGE"></yk-authpup> <view :style="{height: (188+StatusBarRpx)+'rpx'}"></view> </view> </view> </template> <script> import UploadImage from '@/common/utils/upload-image.js' import { validate } from '@/common/utils/validate.js' export default { data() { return { remnant:0, max_txt_num:200, checkedValue: [], head_img_id:0, birthdaypop: false, danshenpop: false, fd1_0_c1id: "", userInfo: { f_label_list:'', f_images_bak:[], f_images_bak:"", invite_code: "", address: "", id: "", user_nickname: "", mobile: "", user_name: "", head_img: "", birthday: "", user_money: "", sex: "", create_time: "", phone: "", coupon: "", age: "", collection_count: "", browse_count: "", }, sex_options: [{ name: "男", value: "1", image: "" }, { name: "女", value: "2", image: "" }], qinggan_options: [{ name: "单身中", value: "1", image: "" }, { name: "恋爱中", value: "2", image: "" }], quanxianType: 'CAMERA', flag: false, choose_type:1, }; }, computed: { themeColor() { return this.$store.getters.themeColor }, selectedCount() { return this.userInfo.f_label_list ? this.userInfo.f_label_list.split(',').length : 0; } }, watch: {}, onLoad(options) { this.getInfo() let that = this uni.$on('nickname', function(res) { console.log(res) // 为 B 页面传过来的值 that.userInfo.user_nickname = res }) }, methods: { descInput() { var txtVal = this.userInfo.autograph.length; this.remnant = txtVal; }, // }, changeAuthXiangce(){ console.log("相册也授权成功?") this.tosuccess() }, changeAuth(){ //再来相册 this.$refs['authpup_xiangce'].open(); }, openCheck() { this.choose_type = 1 if (uni.getSystemInfoSync().platform == "ios") { this.tosuccess() }else{ // #ifdef MP-WEIXIN this.tosuccess() // #endif // #ifdef APP-PLUS this.$refs['authpup'].open(); // #endif } }, openCheck2() { this.choose_type = 2 if (uni.getSystemInfoSync().platform == "ios") { this.tosuccess() }else{ // #ifdef MP-WEIXIN this.tosuccess() // #endif // #ifdef APP-PLUS this.$refs['authpup'].open(); // #endif } }, tosuccess(){ if(this.choose_type == 1){ this.croppingUploadImage('head_img', 'head_img', this.userInfo, this.userInfo)// 头像 }else{ this.$refs.benbenImagesUploadfd1_0_c1.manyChooseImage()//图片集 } }, checkboxChange: function (e) { console.log('checkbox发生change事件,携带value值为:', e) if(this.checkedValue.indexOf(e.detail.value) == -1 && e.detail.value[0]){ this.checkedValue.push(e.detail.value[0]) console.log(this.checkedValue) }else{ let value = e.target.dataset.item.name this.checkedValue.splice(this.checkedValue.indexOf(value), 1) console.log(this.checkedValue) } }, //裁剪图片上传 croppingUploadImage(id, path, obj, obj1, fnName = false) { let self = this if (!obj) obj = this if (!obj1) obj1 = this let itemList = obj1[path] ? ['修改头像', '拍照', '从手机相册选择'] : ['拍照', '从手机相册选择'] function imageCroppingCuccess() { uni.$once('image-cropping-success', (file) => { if (!file) return new UploadImage([file], { complete: (res) => { self.head_img_id = res[0].id if (id) self.$set(obj, id, res[0].id) if (path) self.$set(obj1, path, res[0].path) self.userInfo.f_head_img = res[0].path if (fnName) self[fnName]() setTimeout(function() { uni.hideLoading(); }, 500); }, }) }) } uni.showActionSheet({ itemList: itemList, success: function(res) { if (res.tapIndex == 0 && obj1[path]) { uni.navigateTo({ url: '/pages/benben-built-in/image-cropping/image-cropping?rectHeight=200&rectWidth=200&fileType="jpg"&myImgUrl=' + obj1[path], animationDuration: 0, }) imageCroppingCuccess() } if ((res.tapIndex == 1 && obj1[path]) || (res.tapIndex == 0 && !obj1[path])) { uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有 success: (res) => { // 跳转到图片裁切页面 uni.navigateTo({ url: '/pages/benben-built-in/image-cropping/image-cropping?rectHeight=200&rectWidth=200&fileType="jpg"&myImgUrl=' + res.tempFilePaths[0], animationDuration: 0, }) imageCroppingCuccess() }, }) } if ((res.tapIndex == 2 && obj1[path]) || (res.tapIndex == 1 && !obj1[path])) { uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album'], // 可以指定来源是相册还是相机,默认二者都有 success: (res) => { uni.navigateTo({ url: '/pages/benben-built-in/image-cropping/image-cropping?rectHeight=200&rectWidth=200&fileType="jpg"&myImgUrl=' + res.tempFilePaths[0], animationDuration: 0, }) imageCroppingCuccess() }, }) } } }) }, //上传单图、多图方法 soloChooseImage(id, path, obj, obj1, fnName = false) { let self = this if (!obj) obj = this if (!obj1) obj1 = this if (self.uploading) { return } // 从相册中选择图片 uni.chooseImage({ count: 1, // 默认3 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 success: function(res) { console.log(res, "返回结果"); self.uploading = true // 开始上传 new UploadImage(res.tempFiles, { complete: function(res) { self.uploading = false if (id) self.$set(obj, id, res[0].id) if (path) self.$set(obj1, path, res[0].path) if (fnName) self[fnName]() }, }) }, }) }, //获取用户详细信息 getInfo(){ if(!global.token){ uni.redirectTo({ url:'/pagesLogin/login/login/login' }) return false } this.$api.post(global.apiUrls.post656578e8e6103,{ id:global.userInfo.id, is_my:1 }) .then((res) => { if (res.statusCode == 200 && res.data.code == 1) { this.userInfo = res.data.data var txtVal = this.userInfo.autograph.length; this.remnant = txtVal; } else { this.$message.info(res.data.msg) setTimeout(function(){ uni.navigateBack(-1) },800) } }) .catch((err) => { console.log("err: " + JSON.stringify(err)); }); }, //修改用户资料 async setUserInfoFunc() { var that = this //请求方法 //数据验证 this.flag = false //测试开关 if (this.flag) { return } else { this.flag = true } var params = { f_nickname:this.userInfo.f_nickname, f_height:this.userInfo.f_height, f_weight:this.userInfo.f_weight, f_xueli:this.userInfo.f_xueli, autograph:this.userInfo.autograph, f_qinggan:this.userInfo.f_qinggan, f_zhiye:this.userInfo.f_zhiye, f_label_list:this.userInfo.f_label_list, f_images:this.userInfo.f_images_ids, } if(this.head_img_id > 0){ params.f_head_img = this.head_img_id } params.edit_friend = 1 let datauser = await this.$api.post(global.apiUrls.post5cb54af125f1c, params); this.$message.info(datauser.data.msg); if (datauser.data.code != 1) { this.flag = false return } let infouser = datauser.data; this.flag = false let userInfoTosave = infouser.data.userinfo this.$store.commit('updateUserInfo', userInfoTosave) setTimeout(function(){ that.$urouter.navigateBack(1); },800) } } }; </script> <style lang="scss" scoped> .page { width: 100vw; overflow-x: hidden; min-height: calc(100vh - var(--window-bottom)); background: #F8F8F8; background-size: 100% auto; } .labelSelection_fd1_0_c1_c0_c1_c0 { color:#2fc3b4; font-size: 28rpx; font-weight: 400; } .labelSelection_fd1_0_c1_c0_c1 { background: #fff; padding: 4px 11px 4px 11px; border-radius: 18px; background-size: 100% auto; margin: 0px 8px 8px 0px; border: 1px solid #6bf4e6; color: #6bf4e6; } .labelSelection_fd1_0_c1_c0_c0_c0 { color: #ffffff; font-size: 28rpx; font-weight: 400; } .labelSelection_fd1_0_c1_c0_c0 { background: #6bf4e6; padding: 4px 11px 4px 11px; margin: 0px 8px 8px 0px; border-radius: 18px; background-size: 100% auto; color: #6bf4e6; } .labelSelection_fd1_0_c1 { background: var(--benbenbgColor1); background-size: 100% auto; padding: 32rpx 20rpx 32rpx 32rpx; } .labelSelection_fd1_0_c0_c0_c2 { background: linear-gradient(90deg, #A91EFB 0%, rgba(48, 108, 251, 0.12) 100%); border-radius: 0rpx 0rpx 0rpx 0rpx; width: 68rpx; height: 16rpx; position: absolute; left: 0rpx; bottom: 0rpx; } .labelSelection_fd1_0_c0_c0_c0 { color: #333333; font-size: 36rpx; font-weight: 500; line-height: 52rpx; } .labelSelection_fd1_0_c0_c0 { position: relative; } .labelSelection_fd1_0_c0 { padding: 23rpx 0rpx 23rpx 32rpx; } .user_flex_0 { background: #fff; width: 750rpx; height: 88rpx; overflow: hidden; z-index: 10; top: 0rpx; background-size: 100% auto !important; } .user_fd0_0_c2 { width: 32rpx; height: 32rpx; } .user_fd0_0_c1_c0 { font-size: 36rpx; font-weight: 500; color: #333; line-height: 88rpx; } .user_fd0_0_c0_c0 { font-size: 32rpx; font-weight: 500; color: #333; line-height: 88rpx; } .user_fd0_0 { margin: 0rpx 32rpx 0rpx 32rpx; } .user_flex_1 { background: #fff; padding: 0rpx 32rpx 0rpx 32rpx; } .user_fd1_4 { background: #6bf4e6; border-radius: 44rpx 44rpx 44rpx 44rpx; font-size: 32rpx; color: rgba(255, 255, 255, 1); height: 88rpx; line-height: 88rpx; margin: 45rpx 0rpx 45rpx 0rpx; width: 686rpx; position: fixed; bottom: calc(0rpx + var(--window-bottom)); z-index: 999; } .user_fd1_2_c1_c0_1 { font-size: 32rpx; color: var(--benbenFontColor1); text-align: right; } .user_fd1_2_c1_c0 { font-size: 32rpx; color: #151515; text-align: right; font-weight: 500; } .user_fd1_1_c2 { font-size: 28rpx; margin: 0rpx 0rpx 0rpx 14rpx; } .user_fd1_1_c1 { line-height: 45rpx; font-size: 32rpx; font-weight: 500; color: #151515; text-align: right; margin: 0rpx 0rpx 0rpx 48rpx; } .user_fd1_0_c1_image { width: 100rpx; height: 100rpx; border-radius: 50rpx 50rpx 50rpx 50rpx; } .user_fd1_0_c0 { font-size: 32rpx; font-weight: 500; color: #7F7F7F; } .user_fd1_0 { border-bottom: 1px solid #eee; padding: 32rpx 0rpx 32rpx 0rpx; } .user_picker2_0_c2 { color: #1071F3; font-size: 32rpx; font-weight: 500; } .user_picker2_0_c1 { color: #333333; font-size: 32rpx; font-weight: 500; } .user_picker2_0_c0 { color: #BFBFBF; font-size: 32rpx; font-weight: 500; } .user_picker2_0 { border-bottom: 1px solid #eee; background: #fff; padding: 0rpx 32rpx 0rpx 32rpx; line-height: 88rpx; border-radius: 25rpx 25rpx 0rpx 0rpx; background-size: 100% auto !important; } .user_picker3_0_c2 { color: #1071F3; font-size: 32rpx; font-weight: 500; } .user_picker3_0_c1 { color: #333333; font-size: 32rpx; font-weight: 500; } .user_picker3_0_c0 { color: #BFBFBF; font-size: 32rpx; font-weight: 500; } .user_picker3_0 { border-bottom: 1px solid #eee; background: #fff; padding: 0rpx 32rpx 0rpx 32rpx; line-height: 88rpx; border-radius: 25rpx 25rpx 0rpx 0rpx; background-size: 100% auto !important; } .publish_fd1_3_c0 { background: #3B7EF6; border-radius: 44rpx 44rpx 44rpx 44rpx; width: 686rpx; line-height: 80rpx; font-size: 32rpx; color: #fff; height: 80rpx; } .publish_fd1_3 { background: var(--benbenbgColor1); background-size: 100% auto; position: fixed; bottom: calc(0rpx + var(--window-bottom)); width: 750rpx; height: 128rpx; } .publish_fd1_2_c0_c1_c1 { color: rgba(153, 153, 153, 1); font-size: 26rpx; margin: 0rpx 0rpx 0rpx 10rpx; } .publish_fd1_2 { background: var(--benbenbgColor1); margin: 24rpx 0rpx 0rpx 0rpx; padding: 0rpx 32rpx 0rpx 32rpx; background-size: 100% auto; margin-bottom: 300rpx; } .publish_fd1_1_c2 { padding: 32rpx 0rpx 32rpx 0rpx; } .publish_fd1_1_c0_c1 { text-align: right; } .publish_fd1_1_c0_c0 { color: #333333; font-size: 28rpx; font-weight: 400; } .publish_fd1_1_c0 { border-bottom: 1px solid #eee; padding: 32rpx 0rpx 32rpx 0rpx; } .publish_fd1_1 { background: var(--benbenbgColor1); background-size: 100% auto; padding: 0rpx 32rpx 0rpx 32rpx; } .publish_fd1_0_c12 { font-size: 24rpx; color: #979797 ; width: 600rpx; } .publish_fd1_0_c11 { width: 180rpx; height: 180rpx; // margin: 0rpx 24rpx 16rpx 0rpx; } .publish_fd1_0_c101 { width: 180rpx; height: 180rpx; border-radius: 5px; } .publish_fd1_0_c100 { top: 0rpx; right: 0rpx; z-index: 10; color: red; } .publish_fd1_0_c10 { margin: 0px 11px 8px 0px; } .publish_input_fd1_0_c0 { width: 100%; height: 310rpx; font-size: 28rpx; font-weight: 400; color: #333; white-space: pre-wrap; } .publish_fd1_0_c0 { border-radius: 10rpx 10rpx 10rpx 10rpx; width: 622rpx; } .publish_fd1_0 { background: var(--benbenbgColor1); border-radius: 16rpx; background-size: 100% auto; padding: 24rpx 32rpx 32rpx 32rpx; margin: 32rpx; } </style>
10-22
(gdb) bt #0 lv_obj_get_ext_draw_size (obj=obj@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_draw.c:313 #1 0x0004f490 in lv_obj_invalidate (obj=obj@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_pos.c:847 #2 0x0002fc50 in lv_label_set_text (obj=0x0, text=0xbeeca03c "2025-11-12") at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/widgets/label/lv_label.c:147 #3 0x000c9ebe in tp_lv_time_picker_set_show_time_only (obj=0x4dfd4c <work_mem_int+2506536>, time=<optimized out>) at TpTimePicker.c:341 #4 0x0014d274 in update_time_str_label (obj=obj@entry=0x460324 <work_mem_int+1983744>) at PlaybackBar.c:3961 #5 0x001514b4 in tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2268 #6 tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2216 #7 0x000481cc in lv_obj_event_base (class_p=<optimized out>, e=e@entry=0xbeeca2ac) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:89 #8 0x00048242 in event_send_core (e=e@entry=0xbeeca2ac) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:364 #9 0x0004833e in lv_obj_send_event (obj=<optimized out>, event_code=<optimized out>, param=param@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:67 #10 0x001edc4c in playbackimp_chn_list_change_task_cb (task=<optimized out>) at PlaybackImp.c:689 #11 0x001a53cc in async_task_finish_process (arg=0x3d3bb8 <work_mem_int+1408404>) at TpAsyncTaskQueue.c:994 #12 0x001c45e2 in tp_sync_timer (timer=<optimized out>) at AppInit.c:757 #13 0x0003fadc in lv_timer_exec (timer=0x3aff24 <work_mem_int+1261824>) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:326 #14 lv_timer_handler () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:107 #15 lv_timer_handler () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:63 #16 0x00015758 in main () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/main.c:75 (gdb) p *(tp_lv_time_picker_t *)0x4dfd4c $10 = {obj = {class_p = 0x27be24 <work_mem_int>, parent = 0x27be24 <work_mem_int>, spec_attr = 0x0, styles = 0x0, style_main_prop_is_set = 2611476, style_other_prop_is_set = 56, user_data = 0x0, id = 0x0, coords = {x1 = 391857407, y1 = 0, x2 = 16777215, y2 = 0}, flags = -16777216, state = 64836, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 1, skip_trans = 1, style_cnt = 4, h_layout = 0, w_layout = 0, is_deleting = 0}, ta = 0x57, popup = 0x3d72d0 <work_mem_int+1422508>, header = 0x1, year_label = 0x717, month_label = 0x3de, calendar = 0x739, time_cont = 0x3e8, hms_selector = 0x717, footer = 0x3de, year_picker = 0x739, month_picker = 0x3e8, hms_picker = 0x0, show_label = 0x0, icon = 0x0, showed_date = {year = 0, month = 0 '\000', day = 0 '\000'}, selected_date = {year = 812, month = 0 '\000', day = 0 '\000'}, origin_date = {year = 0, month = 0 '\000', day = 0 '\000'}, clicked_date = {year = 0, month = 0 '\000', day = 0 '\000'}, date_format = 1079, hour_format = (TP_HOUR_FORMAT_12 | unknown: 2), hour = 224 '\340', minute = 253 '\375', second = 77 'M', origin_hour = 224 '\340', origin_minute = 253 '\375', origin_second = 77 'M', am_pm = 77 'M', content_cont = 0x3b, year_grid_btn = {0x430384 <work_mem_int+1787232>, 0x27be24 <work_mem_int>, 0x0, 0x0, 0x27d914 <work_mem_int+6896>, 0x38, 0x0, 0x0, 0x175b44ff, 0x0, 0xffffff <work_mem_int+14172635>, 0x0}, month_grid_btn = {0xff000000, 0x4dfd44 <work_mem_int+2506528>, 0x57, 0x3c3ce0 <work_mem_int+1343164>, 0x1, 0x48f, 0x3de, 0x48f, 0x3e8, 0x48f, 0x3de, 0x48f}, is_calendar = 232} (gdb) p tp_timebar $11 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p g_playback_timebar_obj $12 = (lv_obj_t *) 0x460324 <work_mem_int+1983744> (gdb) p (tp_lv_timebar_t *) 0x460324 $13 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p *(tp_lv_timebar_t *) 0x460324 $14 = {obj = {class_p = 0x23fd60 <tp_lv_timebar_class>, parent = 0x420dd8 <work_mem_int+1724340>, spec_attr = 0x3daba8 <work_mem_int+1437060>, styles = 0x3c6ff4 <work_mem_int+1356240>, style_main_prop_is_set = 65551, style_other_prop_is_set = 0, user_data = 0x606f50 <work_mem_int+3715372>, id = 0x971, coords = {x1 = 280, y1 = 864, x2 = 1919, y2 = 1079}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 1, h_layout = 0, w_layout = 0, is_deleting = 0}, ctrl_obj = 0x3dab6c <work_mem_int+1437000>, chn_name_obj = 0x3cc31c <work_mem_int+1377528>, video_info_obj = 0x3cc224 <work_mem_int+1377280>, bottom_ctrl_obj = 0x3e2ee8 <work_mem_int+1470660>, play_obj = 0x3d56a8 <work_mem_int+1415300>, single_frame_obj = 0x3d57e0 <work_mem_int+1415612>, speed_obj = 0x4449bc <work_mem_int+1870744>, smartspeed_obj = 0x4b7560 <work_mem_int+2340668>, cut_obj = 0x4810d4 <work_mem_int+2118320>, export_obj = 0x4f30d4 <work_mem_int+2585264>, export_label_obj = 0x52bcf8 <work_mem_int+2817748>, scale_obj = 0x42b620 <work_mem_int+1767420>, people_obj = 0x46771c <work_mem_int+2013432>, vehicle_obj = 0x46788c <work_mem_int+2013800>, pet_obj = 0x4679bc <work_mem_int+2014104>, cut_begin_obj = 0x0, cut_end_obj = 0x0, b30_obj = 0x42a540 <work_mem_int+1763100>, calendar_obj = 0x4dfd4c <work_mem_int+2506536>, f30_obj = 0x3d4f8c <work_mem_int+1413480>, hq_obj = 0x467acc <work_mem_int+2014376>, audio_obj = 0x42a260 <work_mem_int+1762364>, zoom_obj = 0x425244 <work_mem_int+1741856>, screennum_obj = 0x0, fullscreen_obj = 0x3cc104 <work_mem_int+1376992>, save_clip_btn_obj = 0x0, continuous_rec_obj = 0x3e2f7c <work_mem_int+1470808>, event_rec_obj = 0x463448 <work_mem_int+1996324>, expend_obj = 0x4dec60 <work_mem_int+2502204>, clear_obj = 0x3e3378 <work_mem_int+1471828>, tip_label = 0x0, play_state = 0, scale_select_idx = 0, scale_idx = 28, scale = 1440, start_time = 1762833600, cur_time = 1762876800, disp_time_gap = 120, time_clip = 12, pressing = 0, volume_val = 0, speed_index = 4, scrollbar_pos = 0, hq_index = 0, pressed_point = {x = 0, y = 0}, last_point = {x = 0, y = 0}, disp_time_label = {0x429158 <work_mem_int+1758004>, 0x429250 <work_mem_int+1758252>, 0x429348 <work_mem_int+1758500>, 0x429444 <work_mem_int+1758752>, 0x466338 <work_mem_int+2008340>, 0x46640c <work_mem_int+2008552>, 0x466514 <work_mem_int+2008816>, 0x466610 <work_mem_int+2009068>, 0x46670c <work_mem_int+2009320>, 0x46680c <work_mem_int+2009576>, 0x478364 <work_mem_int+2082112>, 0x47843c <work_mem_int+2082328>, 0x478538 <work_mem_int+2082580>, 0x478638 <work_mem_int+2082836>, 0x47873c <work_mem_int+2083096>, 0x478838 <work_mem_int+2083348>}, hover_time_obj = 0x462d38 <work_mem_int+1994516>, chn_label = {0x3cc3c8 <work_mem_int+1377700>, 0x3cc500 <work_mem_int+1378012>, 0x3cc5f8 <work_mem_int+1378260>, 0x42905c <work_mem_int+1757752>}, scrollbar_obj = 0x4def7c <work_mem_int+2503000>, show_scrollbar = 1, chn_num = 8, show_chn_idx = 0, expend = 1, mode = 0, stop_update_time = 0, cur_chn = 0, full_show = 0, export_slice_num = 0, cut_setting_time = 0, left_cut_bar_hoverd = false, right_cut_bar_hoverd = false, left_cut_bar_area = {x1 = 0, y1 = 0, x2 = 0, y2 = 0}, right_cut_bar_area = {x1 = 0, y1 = 0, x2 = 0, y2 = 0}} (gdb) p tp_timebar $15 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p tp_timebar->ctrl_obj $16 = (lv_obj_t *) 0x3dab6c <work_mem_int+1437000> (gdb) p *(lv_obj_t *) A syntax error in expression, near `'. (gdb) p *(lv_obj_t *) A syntax error in expression, near `'. (gdb) p *(lv_obj_t *)0x460324 $17 = {class_p = 0x23fd60 <tp_lv_timebar_class>, parent = 0x420dd8 <work_mem_int+1724340>, spec_attr = 0x3daba8 <work_mem_int+1437060>, styles = 0x3c6ff4 <work_mem_int+1356240>, style_main_prop_is_set = 65551, style_other_prop_is_set = 0, user_data = 0x606f50 <work_mem_int+3715372>, id = 0x971, coords = {x1 = 280, y1 = 864, x2 = 1919, y2 = 1079}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 1, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) p *(lv_obj_t *) 0x3dab6c $18 = {class_p = 0x21e488 <lv_obj_class>, parent = 0x460324 <work_mem_int+1983744>, spec_attr = 0x3dac98 <work_mem_int+1437300>, styles = 0x3dabe8 <work_mem_int+1437124>, style_main_prop_is_set = 232015, style_other_prop_is_set = 4111, user_data = 0x0, id = 0x1c42aa <tp_lv_muti_dropdown_set_select+18>, coords = {x1 = 280, y1 = 864, x2 = 1903, y2 = 918}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 4, h_layout = 1, w_layout = 1, is_deleting = 0} (gdb) f 5 #5 0x001514b4 in tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2268 2268 update_time_str_label(obj); (gdb) tp_timebar->chn_num Undefined command: "tp_timebar->chn_num". Try "help". (gdb) p tp_timebar->chn_num $19 = 8 (gdb) p tp_timebar->calendar_obj $20 = (lv_obj_t *) 0x4dfd4c <work_mem_int+2506536> (gdb) p *(lv_obj_t *) 0x4dfd4c $21 = {class_p = 0x27be24 <work_mem_int>, parent = 0x27be24 <work_mem_int>, spec_attr = 0x0, styles = 0x0, style_main_prop_is_set = 2611476, style_other_prop_is_set = 56, user_data = 0x0, id = 0x0, coords = {x1 = 391857407, y1 = 0, x2 = 16777215, y2 = 0}, flags = -16777216, state = 64836, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 1, skip_trans = 1, style_cnt = 4, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) p *(lv_obj_t *)0x27be24 $22 = {class_p = 0x0, parent = 0x0, spec_attr = 0x4deff8 <work_mem_int+2503124>, styles = 0x3cc4d8 <work_mem_int+1377972>, style_main_prop_is_set = 1050623, style_other_prop_is_set = 3271562920, user_data = 0xf399dbff, id = 0x35c7bdff, coords = {x1 = -1589395569, y1 = 1596, x2 = 385884183, y2 = 604013289}, flags = 8200, state = 129, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 0, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) x/16xw 0x4dfd4c 0x4dfd4c <work_mem_int.12761+2506536>: 0x0027be24 0x0027be24 0x00000000 0x00000000 0x4dfd5c <work_mem_int.12761+2506552>: 0x0027d914 0x00000038 0x00000000 0x00000000 0x4dfd6c <work_mem_int.12761+2506568>: 0x175b44ff 0x00000000 0x00ffffff 0x00000000 0x4dfd7c <work_mem_int.12761+2506584>: 0xff000000 0x004dfd44 0x00000057 0x003d72d0 帮我分析上述调用栈
最新发布
11-18
这是飞控中DronCAN的初始化函数,哪个是给其他设备设置节点语句void AP_DroneCAN::init(uint8_t driver_index, bool enable_filters) { if (driver_index != _driver_index) { debug_dronecan(AP_CANManager::LOG_ERROR, “DroneCAN: init called with wrong driver_index”); return; } if (_initialized) { debug_dronecan(AP_CANManager::LOG_ERROR, “DroneCAN: init called more than once\n\r”); return; } uint8_t node = _dronecan_node; if (node < 1 || node > 125) { // reset to default if invalid _dronecan_node.set(AP_DRONECAN_DEFAULT_NODE); node = AP_DRONECAN_DEFAULT_NODE; } node_info_rsp.name.len = hal.util->snprintf((char*)node_info_rsp.name.data, sizeof(node_info_rsp.name.data), "org.ardupilot:%u", driver_index); node_info_rsp.software_version.major = AP_DRONECAN_SW_VERS_MAJOR; node_info_rsp.software_version.minor = AP_DRONECAN_SW_VERS_MINOR; node_info_rsp.hardware_version.major = AP_DRONECAN_HW_VERS_MAJOR; node_info_rsp.hardware_version.minor = AP_DRONECAN_HW_VERS_MINOR; #if HAL_CANFD_SUPPORTED if (option_is_set(Options::CANFD_ENABLED)) { canard_iface.set_canfd(true); } #endif uint8_t uid_len = sizeof(uavcan_protocol_HardwareVersion::unique_id); uint8_t unique_id[sizeof(uavcan_protocol_HardwareVersion::unique_id)]; mem_pool = NEW_NOTHROW uint32_t[_pool_size/sizeof(uint32_t)]; if (mem_pool == nullptr) { debug_dronecan(AP_CANManager::LOG_ERROR, "DroneCAN: Failed to allocate memory pool\n\r"); return; } canard_iface.init(mem_pool, (_pool_size/sizeof(uint32_t))*sizeof(uint32_t), node); if (!hal.util->get_system_id_unformatted(unique_id, uid_len)) { return; } unique_id[uid_len - 1] += node; memcpy(node_info_rsp.hardware_version.unique_id, unique_id, uid_len); //Start Servers if (!_dna_server.init(unique_id, uid_len, node)) { debug_dronecan(AP_CANManager::LOG_ERROR, "DroneCAN: Failed to start DNA Server\n\r"); return; }
03-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值