嵌入式GUI FTK設計與實現 主迴圈

2021-09-01 05:49:05 字數 4000 閱讀 6257

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

[c-sharp]view plain

copy

print?

ret ftk_main_loop_add_source(ftkmainloop* thiz, ftksource* source)  

;  return_val_if_fail(thiz != null && source != null, ret_fail);  

event.type = ftk_evt_add_source;  

event.u.extra = source;  

return ftk_source_queue_event(ftk_primary_source(), &event);  

}  ret ftk_main_loop_remove_source(ftkmainloop* thiz, ftksource* source)  

;  return_val_if_fail(thiz != null && source != null, ret_fail);  

event.type = ftk_evt_remove_source;  

event.u.extra = source;  

return ftk_source_queue_event(ftk_primary_source(), &event);  

}  這個事件由primary source進行處理:  

static ret ftk_source_primary_dispatch(ftksource* thiz)  

case ftk_evt_remove_source:  

}  ...  

}  

ret ftk_main_loop_add_source(ftkmainloop* thiz, ftksource* source);    return_val_if_fail(thiz != null && source != null, ret_fail);     event.type = ftk_evt_add_source;    event.u.extra = source;     return ftk_source_queue_event(ftk_primary_source(), &event);} ret ftk_main_loop_remove_source(ftkmainloop* thiz, ftksource* source);    return_val_if_fail(thiz != null && source != null, ret_fail);     event.type = ftk_evt_remove_source;    event.u.extra = source;     return ftk_source_queue_event(ftk_primary_source(), &event);}這個事件由primary source進行處理:static ret ftk_source_primary_dispatch(ftksource* thiz)        case ftk_evt_remove_source:            }    ...}

現在我們來看ftk_main_loop_run的實現,ftk_main_loop_run的實現是平台相關的,對於支援select的平台,用 select是最好的方法。下面是基於select的實現:

1.找出最小等待時間和檔案描述符

[c-sharp]view plain

copy

print?

for(i = 0; i sources_manager); i++)  

source_wait_time = ftk_source_check(source);  

if(source_wait_time >= 0 && source_wait_time 

}  for(i = 0; i < ftk_sources_manager_get_count(thiz->sources_manager); i++)                     source_wait_time = ftk_source_check(source);            if(source_wait_time >= 0 && source_wait_time < wait_time)                    }

這裡遍歷所有source,找出乙個最小的等待時間和要等待的檔案描述符。

2. 等待事件發生

[c-sharp]view plain

copy

print?

tv.tv_sec = wait_time/1000;  

tv.tv_usec = (wait_time%1000) * 1000;  

ret = select(mfd + 1, &thiz->fdset, null, null, &tv);  

tv.tv_sec = wait_time/1000;        tv.tv_usec = (wait_time%1000) * 1000;        ret = select(mfd + 1, &thiz->fdset, null, null, &tv);

3.檢查事件源並呼叫相應的事件處理函式

[c-sharp]view plain

copy

print?

if( (ret > 0) && (fd = ftk_source_get_fd(source)) >= 0 && fd_isset(fd, &thiz->fdset))  

else

continue;  

}  //這裡處理timer和idle。

if((source_wait_time = ftk_source_check(source)) == 0)  

else

continue;  

}  

if( (ret > 0) && (fd = ftk_source_get_fd(source)) >= 0 && fd_isset(fd, &thiz->fdset))                            else                                continue;            }            //這裡處理timer和idle。            if((source_wait_time = ftk_source_check(source)) == 0)                            else                                continue;            }

如果事件源處理函式的返回值不是ret_ok的事件,我們認為出錯了或者是事件要求自己被移除,那就把它移除掉。

gui是事件驅動的,建立乙個視窗後,函式馬上就返回了,視窗中的控制項對使用者事件處理是在以後的事件迴圈中進行的。這對於大多數情況是正常的,但有時我們需要使用者確認一些問題,根據確認的結果做相應的處理。比如,使用者刪除乙個檔案,我們要確認他是否真的想刪除後才能去刪除。也就是在建立對話方塊後,函式不是馬上返回,而且等使用者確認,關閉對話方塊後才返回。

為了做到這一點,我們要在乙個事件處理函式中,建立另外乙個主迴圈來分發事件。模態對話方塊就是這樣實現的:

[c-sharp]view plain

copy

print?

int ftk_dialog_run(ftkwidget* thiz)    

int ftk_dialog_run(ftkwidget* thiz)

對話模型提供了乙個用於退出該主迴圈的函式:

[c-sharp]view plain

copy

print?

ret ftk_dialog_quit(ftkwidget* thiz)    

ret ftk_dialog_quit(ftkwidget* thiz)

給我老師的人工智慧教程打call!

嵌入式GUI FTK 介面設計器

作者 李先靜 微博 ftk ui 設計器是乙個普通的ftk應用程式,可以從桌面的應用程式列表中進入 新建 建立乙個新視窗。開啟 開啟乙個存在的xul檔案。儲存 儲存設計結果到乙個xul檔案,同時產生c 幫助 顯示幫助資訊。退出 退出應用程式 不儲存結果 按insert鍵 可以放入新控制項。按dele...

嵌入式GUI ftk 0 3發布

作者 李先靜 經過春節長假的努力,ftk 0.3如期發布,其主要修改有 特別感謝huang riwen兄和feng huajun兄,riwen兄發現並修改了bmp影象解碼中的bug。huajun同意我在ftk使用fitx輸入法 中的詞庫。附 a gui library for embedded sy...

嵌入式開發與設計流程

一 嵌入式作業系統的分類 實時作業系統 vxworks wince onx.nucleus 非實時作業系統 嵌入式linux 具有作業系統的嵌入式軟體層次 1 驅動層程式 2 實時作業系統 rtos 3 作業系統的應用程式介面 api 4 應用程式 二 嵌入式處理器分類 1 嵌入式微控制器 micr...