LVGL-输入设备LV_INDEV_TYPE_POINTER类型

2023-10-30

void _lv_indev_read_task(lv_task_t * task)是定时执行的输入设备任务回调函数。会处理输入设备的数据。

按下的处理:

        static void indev_proc_press(lv_indev_proc_t * proc)

        {

        ……

        *首先从layer_sys,layer_top,scr_act按优级查找当前的活动对象

       /* bool lv_obj_is_point_on_coords(lv_obj_t * obj, const lv_point_t * point)*/

        indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_sys(disp),         &proc->types.pointer.act_point);

        if(indev_obj_act == NULL) indev_obj_act =         lv_indev_search_obj(lv_disp_get_layer_top(disp),
                                                                          &proc->types.pointer.act_point);
        if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_scr_act(disp),
                                                                          &proc->types.pointer.act_point);
        new_obj_searched = true;

        ……

        *如果按下时有throw动作手动停止。page drag后一般有throw动作。

            /*The last object might have drag throw. Stop it manually*/
            if(new_obj_searched && proc->types.pointer.last_obj) {
                proc->types.pointer.drag_throw_vect.x = 0;
                proc->types.pointer.drag_throw_vect.y = 0;
                indev_drag_throw(proc);
            }

        ……

        *如果当前的活动对与上一次的活动对象不一样。proc->types.pointer.act_obj是上一次的活动  对象,通知上一个活动对象PRESS_LOST(1次)。通知最近的对象被PRESSED(1次),并复位一些寄存器。

    /*If a new object was found reset some variables and send a pressed signal*/
    if(indev_obj_act != proc->types.pointer.act_obj) {
        /*刚选中的活动对象不产生坐标向量值,把last_point与act_point同步*/
        proc->types.pointer.last_point.x = proc->types.pointer.act_point.x;
        proc->types.pointer.last_point.y = proc->types.pointer.act_point.y;

        /*If a new object found the previous was lost, so send a signal*/
        if(proc->types.pointer.act_obj != NULL) {
            /*Save the obj because in special cases `act_obj` can change in the signal function*/
            lv_obj_t * last_obj = proc->types.pointer.act_obj;

            last_obj->signal_cb(last_obj, LV_SIGNAL_PRESS_LOST, indev_act);
            if(indev_reset_check(proc)) return;
            lv_event_send(last_obj, LV_EVENT_PRESS_LOST, NULL);
            if(indev_reset_check(proc)) return;

        }

        proc->types.pointer.act_obj  = indev_obj_act; /*Save the pressed object*/
        proc->types.pointer.last_obj = indev_obj_act;

        if(indev_obj_act != NULL) {
            /* Save the time when the obj pressed to count long press time.*/
            proc->pr_timestamp                 = lv_tick_get();
            proc->long_pr_sent                 = 0;
            proc->types.pointer.drag_limit_out = 0;
            proc->types.pointer.drag_in_prog   = 0;
            proc->types.pointer.drag_sum.x     = 0;
            proc->types.pointer.drag_sum.y     = 0;
            proc->types.pointer.drag_dir = LV_DRAG_DIR_BOTH;
            proc->types.pointer.gesture_sent   = 0;
            proc->types.pointer.gesture_sum.x  = 0;
            proc->types.pointer.gesture_sum.y  = 0;
            proc->types.pointer.vect.x         = 0;
            proc->types.pointer.vect.y         = 0;

            /*Search for 'top' attribute*/
            lv_obj_t * i        = indev_obj_act;
            lv_obj_t * last_top = NULL;
            while(i != NULL) {
                if(i->top) last_top = i;
                i = lv_obj_get_parent(i);
            }

            if(last_top != NULL) {
                /*Move the last_top object to the foreground*/
                lv_obj_move_foreground(last_top);
            }

            /*Send a signal about the press*/
            indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, indev_act);
            if(indev_reset_check(proc)) return;

            lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL);
            if(indev_reset_check(proc)) return;

            if(indev_act->proc.wait_until_release) return;

            /*Handle focus*/
            indev_click_focus(&indev_act->proc);
            if(indev_reset_check(proc)) return;

        }
    }

        *构建drag_throw_vect(throw效果的向量)与vect(两次坐标输入向量)的相关性,方便释放时使用。

    ……
    /*Calculate the types.pointer.vector*/
    proc->types.pointer.vect.x = proc->types.pointer.act_point.x - proc->types.pointer.last_point.x;
    proc->types.pointer.vect.y = proc->types.pointer.act_point.y - proc->types.pointer.last_point.y;

    proc->types.pointer.drag_throw_vect.x = (proc->types.pointer.drag_throw_vect.x * 5) >> 3;
    proc->types.pointer.drag_throw_vect.y = (proc->types.pointer.drag_throw_vect.y * 5) >> 3;

    if(proc->types.pointer.drag_throw_vect.x < 0)
        proc->types.pointer.drag_throw_vect.x++;
    else if(proc->types.pointer.drag_throw_vect.x > 0)
        proc->types.pointer.drag_throw_vect.x--;

    if(proc->types.pointer.drag_throw_vect.y < 0)
        proc->types.pointer.drag_throw_vect.y++;
    else if(proc->types.pointer.drag_throw_vect.y > 0)
        proc->types.pointer.drag_throw_vect.y--;

    proc->types.pointer.drag_throw_vect.x += (proc->types.pointer.vect.x * 4) >> 3;
    proc->types.pointer.drag_throw_vect.y += (proc->types.pointer.vect.y * 4) >> 3;
    ……

        *处理拖动、手势、长按、重复长按。PRESSING信号会一直发送。

    /*If there is active object and it can be dragged run the drag*/
    if(indev_obj_act != NULL) 
    {
        indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSING, indev_act);
        if(indev_reset_check(proc)) return;
        lv_event_send(indev_obj_act, LV_EVENT_PRESSING, NULL);
        if(indev_reset_check(proc)) return;
        if(indev_act->proc.wait_until_release) return;

        indev_drag(proc);
        indev_gesture(proc);
        if(indev_reset_check(proc)) return;

        /*If there is no drag then check for long press time*/
        if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 0) 
        {
            /*Send a signal about the long press if enough time elapsed*/
            if(lv_tick_elaps(proc->pr_timestamp) >                 indev_act->driver.long_press_time)                                  
            {
                indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, indev_act);
                if(indev_reset_check(proc)) return;
                lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL);
                if(indev_reset_check(proc)) return;

                /*Mark the signal sending to do not send it again*/
                proc->long_pr_sent = 1;

                /*Save the long press time stamp for the long press repeat handler*/
                proc->longpr_rep_timestamp = lv_tick_get();
            }
        }
        /*Send long press repeated signal*/
        if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 1) 
        {
            /*Send a signal about the long press repeat if enough time elapsed*/
            if(lv_tick_elaps(proc->longpr_rep_timestamp) > indev_act->driver.long_press_rep_time) 
            {
                indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS_REP, indev_act);
                if(indev_reset_check(proc)) return;
                lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, NULL);
                if(indev_reset_check(proc)) return;
                proc->longpr_rep_timestamp = lv_tick_get();
            }
        }
    }

   *indev_drag有两个变量,proc->types.pointer.drag_limit_out全局变量开启拖累后会一直为1,切到新对象才到写0。drag_just_started局部变量与limit_out同时置位控制方向,DRAG_BEGIN信号发送。

static void indev_drag(lv_indev_proc_t * proc)
{
    lv_obj_t * drag_obj    = get_dragged_obj(proc->types.pointer.act_obj);
    bool drag_just_started = false;
    uint8_t drag_dir; //saimen

    if(drag_obj == NULL) return;

    if(lv_obj_get_drag(drag_obj) == false) return;

    lv_drag_dir_t allowed_dirs = lv_obj_get_drag_dir(drag_obj);

    /*Count the movement by drag*/
    if(proc->types.pointer.drag_limit_out == 0) {
        proc->types.pointer.drag_sum.x += proc->types.pointer.vect.x;
        proc->types.pointer.drag_sum.y += proc->types.pointer.vect.y;

        /*Enough move?*/
        bool hor_en = false;
        bool ver_en = false;
        if(allowed_dirs == LV_DRAG_DIR_HOR || allowed_dirs == LV_DRAG_DIR_BOTH) {
            hor_en = true;
        }

        if(allowed_dirs == LV_DRAG_DIR_VER || allowed_dirs == LV_DRAG_DIR_BOTH ||\
           allowed_dirs == LV_DRAG_DIR_VER_ONLY_UP || allowed_dirs == LV_DRAG_DIR_VER_ONLY_DOWN) {
            ver_en = true;
        }

        if(allowed_dirs == LV_DRAG_DIR_ONE) {
            if(LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y)) {
                hor_en = true;
                drag_dir = 0x10;
            }
            else {
                ver_en = true;
                drag_dir = 0x20;
            }
        }

        /*If a move is greater then LV_DRAG_LIMIT then begin the drag*/
        if((hor_en && LV_MATH_ABS(proc->types.pointer.drag_sum.x) >= indev_act->driver.drag_limit) ||
           (ver_en && LV_MATH_ABS(proc->types.pointer.drag_sum.y) >= indev_act->driver.drag_limit)) {
            proc->types.pointer.drag_limit_out = 1;
            drag_just_started                   = true;
            if(drag_dir==0x10)
            {
                if(proc->types.pointer.drag_sum.x>0)
                {
                    drag_dir |= 1;
                }
                else
                {
                    drag_dir |= 2;
                }
            }
            else
            {
                if(proc->types.pointer.drag_sum.y>0)
                {
                    drag_dir |= 1;
                }
                else
                {
                    drag_dir |= 2;
                }
            }
        }
    }

    /*If the drag limit is exceeded handle the dragging*/
    if(proc->types.pointer.drag_limit_out != 0) {
        /*Set new position if the vector is not zero*/
        if(proc->types.pointer.vect.x != 0 || proc->types.pointer.vect.y != 0) {

            lv_coord_t prev_x     = drag_obj->coords.x1;
            lv_coord_t prev_y     = drag_obj->coords.y1;
            lv_coord_t prev_par_w = lv_obj_get_width(lv_obj_get_parent(drag_obj));
            lv_coord_t prev_par_h = lv_obj_get_height(lv_obj_get_parent(drag_obj));

            /*Get the coordinates of the object and modify them*/
            lv_coord_t act_x = lv_obj_get_x(drag_obj);
            lv_coord_t act_y = lv_obj_get_y(drag_obj);

            if(allowed_dirs == LV_DRAG_DIR_BOTH) {
                if(drag_just_started) {
                    proc->types.pointer.drag_dir = LV_DRAG_DIR_BOTH;
                    act_x += proc->types.pointer.drag_sum.x;
                    act_y += proc->types.pointer.drag_sum.y;
                }
            }
            else if(allowed_dirs == LV_DRAG_DIR_HOR) {
                if(drag_just_started) {
                    proc->types.pointer.drag_dir = LV_DRAG_DIR_HOR;
                    proc->types.pointer.drag_sum.y = 0;
                    act_x += proc->types.pointer.drag_sum.x;
                }
            }
            else if(allowed_dirs == LV_DRAG_DIR_VER) {
                if(drag_just_started) {
                    proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;
                    proc->types.pointer.drag_sum.x = 0;
                    act_y += proc->types.pointer.drag_sum.y;
                }
            }
            else if(allowed_dirs == LV_DRAG_DIR_ONE) {
                if(drag_just_started) {
                    if(LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y)) {
                        proc->types.pointer.drag_dir = LV_DRAG_DIR_HOR;
                        proc->types.pointer.drag_sum.y = 0;
                        act_x += proc->types.pointer.drag_sum.x;
                    }
                    else {
                        proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;
                        proc->types.pointer.drag_sum.x = 0;
                        act_y += proc->types.pointer.drag_sum.y;
                    }
                }
            }
            else if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_UP) {
                if (drag_just_started) {
                    proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;
                    proc->types.pointer.drag_sum.x = 0;
                    if (act_y + proc->types.pointer.drag_sum.y <= 0)
                        act_y += proc->types.pointer.drag_sum.y;
                    else
                        proc->types.pointer.drag_sum.y = 0;
                }
            }
            else if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_DOWN) {
                if (drag_just_started) {
                    proc->types.pointer.drag_dir = LV_DRAG_DIR_VER;
                    proc->types.pointer.drag_sum.x = 0;
                    if (act_y + proc->types.pointer.drag_sum.y >= 0)
                        act_y += proc->types.pointer.drag_sum.y;
                    else
                        proc->types.pointer.drag_sum.y = 0;
                }
            }
            

            /*Move the object*/
            if(allowed_dirs == LV_DRAG_DIR_HOR ||
               allowed_dirs == LV_DRAG_DIR_BOTH ||
               (allowed_dirs == LV_DRAG_DIR_ONE &&
                LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y))) {
                act_x += proc->types.pointer.vect.x;
            }
            if(allowed_dirs == LV_DRAG_DIR_VER ||
               allowed_dirs == LV_DRAG_DIR_BOTH ||
               (allowed_dirs == LV_DRAG_DIR_ONE &&
                LV_MATH_ABS(proc->types.pointer.drag_sum.x) < LV_MATH_ABS(proc->types.pointer.drag_sum.y))) {
                act_y += proc->types.pointer.vect.y;
            }
            if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_UP)
            {
                if (act_y + proc->types.pointer.vect.y <= 0)
                    act_y += proc->types.pointer.vect.y;
            }
            if (allowed_dirs == LV_DRAG_DIR_VER_ONLY_DOWN)
            {
                if (act_y + proc->types.pointer.vect.y >= 0)
                    act_y += proc->types.pointer.vect.y;
            }

            uint16_t inv_buf_size =
                lv_disp_get_inv_buf_size(indev_act->driver.disp); /*Get the number of currently invalidated areas*/

            lv_obj_set_pos(drag_obj, act_x, act_y);
            proc->types.pointer.drag_in_prog = 1;

            /*If the object didn't moved then clear the invalidated areas*/
            if(drag_obj->coords.x1 == prev_x && drag_obj->coords.y1 == prev_y) {
                /*In a special case if the object is moved on a page and
                 * the scrollable has fit == true and the object is dragged of the page then
                 * while its coordinate is not changing only the parent's size is reduced */
                lv_coord_t act_par_w = lv_obj_get_width(lv_obj_get_parent(drag_obj));
                lv_coord_t act_par_h = lv_obj_get_height(lv_obj_get_parent(drag_obj));
                if(act_par_w == prev_par_w && act_par_h == prev_par_h) {
                    uint16_t new_inv_buf_size = lv_disp_get_inv_buf_size(indev_act->driver.disp);
                    _lv_disp_pop_from_inv_buf(indev_act->driver.disp, new_inv_buf_size - inv_buf_size);
                }
            }

            /*Set the drag in progress flag*/
            /*Send the drag begin signal on first move*/
            if(drag_just_started) {
                drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_BEGIN, indev_act);
                if(indev_reset_check(proc)) return;

                //lv_event_send(drag_obj, LV_EVENT_DRAG_BEGIN, NULL);
                lv_event_send(drag_obj, LV_EVENT_DRAG_BEGIN, &drag_dir);
                if(indev_reset_check(proc)) return;
            }

        }
    }
}

*indev_drag中的通过调用void lv_obj_set_pos()来改变坐标,触发滚动传输。第次坐标的改变都会通知到父、子对象还有自已。

释放的处理:

static void indev_proc_release(lv_indev_proc_t * proc)

等一下写



 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVGL-输入设备LV_INDEV_TYPE_POINTER类型 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • atomicops.h

    https git project hobbit eu dj16 ricec blob c9d3dceb1c3b1c03a42077e0461e3ce5a2615a51 data atomicops h L248 2013 2016 Cam
  • Postgresql 快速实现 表数据备份与恢复

    背景 在大批量数据备份 或迁移时 如果使用客户端则效率低耗时长 推荐使用服务器执行命令速度快 一 备份表 1 这里使用的是Linux服务器 首先进入安装当前数据库的服务器 可以在home目录下新建一个文件夹 2 输入命令 pg dump t
  • 99款高质量免费HTML/CSS模板(看到了还行,推荐给大家)

    大家都清楚一个网站象征着你和你的品牌 这取决于你如何构建自己的网站 正因为Wordpress越来越受到互联网设计群体的关注 它并不代表最基本的 X HTML CSS很丑 很杂乱和单调 向大家推荐99个高质量的免费 X HTML CSS模板
  • 【错误】kex_exchange_identification: Connection closed by remote hos

    文章目录 错误描述 解决方法 错误描述 在 git push 的时候出现了下面这个错误 kex exchange identification Connection closed by remote host Connection clos
  • C#实现海康威视摄像头的控制

    C 实现海康威视摄像头控制 海康威视网络摄像头SDK开发示例 C C Java Python等
  • (android 地图开发) 高德地图添加浮动按钮

    问题描述 在地图上添加一个按钮 可以响应点击 但是按钮时固定的 地图拖动时 按钮不能动 解决思路 刚开始接触地图开发时 也曾经在这个问题上纠结过 刚刚学会了在地图上添加各种图层 无论是在地图上画大头针也好 绘制路线也好 都是使用图层来处理
  • c++临时对象与空指针导致clion debugger无法运行的bug

    c 临时对象与空指针导致clion debugger无法运行的bug include
  • Linux下安装Tomcat,部署web项目

    一个Linux下运行两个Tomcat的通用做法 一 准备 Tomcat的Linux版本安装包 apache tomcat 7 0 85 tar gz 项目的war包 henNB war eclipse导出为war或者idea build w
  • SQL注入之堆叠注入(sql-lab第38关)

    什么是堆叠注入 在SQL中 分号 是用来表示一条SQL语句结束的 试想一下我们在分号结束一个SQL语句后继续构造下一条语句 会不会一起执行 因此这个想法也就造就了堆叠注入 而堆叠注入可以执行的是任意语句 增删改查 例如以下这个例子 用户输入
  • IDEA启动tomcat控制台中文乱码问题

    项目结构 pom xml
  • osg fbo(一),生成颜色缓冲区图片

    由于工作需要 重新捡了下shader 很明显 fbo是重中之重 好记性不如烂笔头 先记录下 1 生成一个颜色纹理 为了省事 可以将纹理宽高 屏幕宽高 osg ref ptr
  • android10编译 lunch失败,Android各种编译错误的解决方案

    相信大家在编译固件的时候 经常会遇到莫名奇妙的编译错误 从今往后 不用再受这个问题的困扰了 1 常见编译的错误信息 make 1 No rule to make target out target common obj PACKAGING
  • 机器学习---算法基础(十一)贝叶斯网络

    参考文章 频率学派还是贝叶斯学派 聊一聊机器学习中的MLE和MAP 贝叶斯网络 看完这篇我终于理解了 附代码 概率图模型之贝叶斯网络 背景 边缘分布 条件分布 边缘分布 对于单个因素所发生的概率 不考虑其他因素 例如P A 条件分布 在某个
  • 【机器学习-西瓜书】第3章-线性模型

    3 1 基本形式 示例x由 d个属性描述 线性模型 试图学得一个通过属性的线性组合来进行预测的函数 即 3 2 线性回归 3 2 1 一元线性回归 for regression 给定数据集 先考虑最简单的情形 输入只有一个属性 此时线性回归
  • Vue项目打包为桌面应用

    name deskapp version 1 0 0 description main App index html window title 我的桌面应用 icon width 1366 height 768 toolbar false
  • 三个箭头循环标志_科目一交通标志

    如遇格式错乱 图片无法加载 请点击下方链接阅读原文 驾考系列 科目一交通标志 stackoverflow club 分类 交通标志分为主标志和辅助标志两大类 主标志有警告标志 禁令标志 指示标志和指路标志 警告标志 警告车辆与行人注意 黄底
  • springboot项目打包

    springboot项目打包 一 遇到问题 二 项目打包 一 遇到问题 问题 无效的标记 release spring boot starter parent 版本为3 0 0以及以上 与jdk1 8的版本不匹配 release是jdk1
  • 网络爬虫选择代理IP的标准

    Hey 小伙伴们 作为一家http代理产品供应商 我知道网络爬虫在选择代理IP时可能会遇到些问题 毕竟市面上有很多选择 别担心 今天我要给大家分享一些实用的建议 帮助你们选择适合网络爬虫的代理IP 一起来看看吧 首先 我们需要了解爬虫使用代
  • css中如何调整元素位置

    我们通常把样式层叠表叫做css 它是用来修饰html内容的 给内容加各种各样的样式和效果 那么在写实际项目过程中经常会遇到一个普遍性问题 就是调整元素的位置 如果只对于初学编程的人来说 只能用css的知识去做 我们也可以总结一些实用性办法
  • LVGL-输入设备LV_INDEV_TYPE_POINTER类型

    void lv indev read task lv task t task 是定时执行的输入设备任务回调函数 会处理输入设备的数据 按下的处理 static void indev proc press lv indev proc t pr