分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
[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...