-
Notifications
You must be signed in to change notification settings - Fork 764
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
window_manager_default_close_window 关闭窗口死循环问题 #872
Comments
不会死循环啊。如果窗口还没打开就异步关闭。 |
异步关闭是指idle的回调函数吗,因为我这里遇到一个awtk卡死的问题,最后看coredump结果是卡在这一行,而且复现的概率比较低,我想知道如果窗口还没有打开的话,进入到这个分支,然后idle定时器的回调函数还是调用的window_manager_close_window函数,这中间没有其他处理,是不是会一直循环下去? static ret_t window_manager_default_on_idle_check_and_close_window(const idle_info_t* idle) { |
方便的话,你弄个可以重现的demo给我看看。 |
我这里也就复现了两次,看上去都和close_all 有关,代码是参考的window_manager_close_all这个函数,但是把里面的window_manager_close_window_force改成window_close(win) 类似于下面这样 ret_t window_manager_close_all(widget_t* widget) { do { return RET_OK; 功能就是将之前的页面关闭然后打开新的页面,在点击按钮关闭的时候就有很小的概率会陷入死循环 |
正常情况下,关闭还没有打开的窗口,第一次关闭失败,第二次会关闭成功,窗口被销毁,然后窗口相关的idle都会被移除掉,不会进入死循环。 |
我改了一下,你更新试试,谢谢。 |
我昨天找到了必现方法,很抱歉是我之前的猜想是错误的,谢谢您帮忙跟进,卡死的原因是在do while循环里面不停地获取第一个elms, 然而调用window close 函数走到if (!window_is_opened(window))这个分支的时候,实际新窗口已经load上 ,但是状态还没到下一个主循环,所以状态还是WINDOW_STAGE_LOADED,这个时候会走到if (!window_is_opened(window))这个分支里面,然后不停的加idle定时器,实际是当前主循环一直卡死,没有走到下一个idle dispatch, 我当前的解决办法是修改window_is_opened(window)函数,放宽window_is_open的判断条件:具体修改如下: return stage != WINDOW_STAGE_CLOSED && stage != WINDOW_STAGE_NONE; |
最近开发过程中发现在执行window_manager_default_close_window函数的时候会触发条件走到以下分支,然后死循环,想问一下这段代码的意义,看上去只要条件成立就是死循环,是否可以删除
if (!window_is_opened(window)) {
uint32_t idle_id = widget_get_prop_int(window, "check_and_close_window_idle_id", 0);
if (idle_id == 0) {
idle_id = widget_add_idle(window, window_manager_default_on_idle_check_and_close_window);
widget_set_prop_int(window, "check_and_close_window_idle_id", idle_id);
}
return RET_OK;
}
The text was updated successfully, but these errors were encountered: