GUI-компоненты можно использовать только в GUI потоке. Чтобы работать с ними из не-GUI потока, необходимо применить последовательную обработку.
idle_queue отправляет запрос на добавление idle в очередь событий главного цикла GUI потока. Главный цикл GUI потока помещает функцию idle в менеджер idle при обработке очереди событий. При распределении idle функция idle выполняется в GUI потоке.
/**
* @method idle_queue
* Используется для добавления idle из не-GUI потока. Эта функция отправляет запрос на увеличение idle в очередь событий основного цикла.
* @annotation ["static"]
* @param {idle_func_t} on_idle Функция обратного вызова idle.
* @param {void*} ctx Контекст функции обратного вызова idle.
*
* @return {ret_t} Возвращает RET_OK в случае успеха, иначе — ошибку.
*/
ret_t idle_queue(idle_func_t on_idle, void* ctx);
Если функция on_idle возвращает RET_REPEAT, она будет выполнена повторно.
timer_queue отправляет запрос на добавление таймера в очередь событий главного цикла GUI потока. Главный цикл GUI потока помещает функцию таймера в менеджер таймеров при обработке очереди событий. Когда таймер распределяется, функция таймера выполняется в GUI потоке.
/**
* @method timer_queue
* Используется для добавления таймера из не-GUI потока. Эта функция отправляет запрос на увеличение таймера в очередь событий основного цикла.
* @annotation ["static"]
* @param {timer_func_t} on_timer Функция обратного вызова таймера. Если функция обратного вызова возвращает RET_REPEAT, то она будет выполняться повторно. В противном случае она автоматически удаляется.
* @param {void*} ctx Контекст функции обратного вызова таймера.
* @param {uint32_t} duration Время.
*
* @return {ret_t} Возвращает RET_OK в случае успеха, иначе — ошибку.
*/
ret_t timer_queue(timer_func_t on_timer, void* ctx, uint32_t duration);
tk_run_in_ui_thread позволяет фоновому потоку выполнять указанную функцию в UI потоке. Это оболочка для idle_queue, которая поддерживает ожидание завершения вызова.
/**
* @method tk_run_in_ui_thread
* Выполняет указанную функцию в потоке UI.
*
* @param {tk_callback_t} func Функция.
* @param {void*} ctx Контекст функции.
* @param {bool_t} wait_until_done Ожидать ли завершения.
*
* @return {ret_t} Возвращает RET_OK в случае успеха, иначе — ошибку.
*/
ret_t tk_run_in_ui_thread(tk_callback_t func, void* ctx, bool_t wait_until_done)
Если wait_until_done имеет значение FALSE, и функция func возвращает RET_REPEAT, функция будет выполнена повторно.
Обратите внимание: это лишь несколько функций, которые можно безопасно вызывать из не-GUI потоков. Не следует вызывать другие функции, связанные с виджетами, из не-GUI потоков.
Пример:
void* test_thread1(void* args) {
int nr = 500000;
while ((nr-- > 0) && (!s_app_quit)) {
tk_run_in_ui_thread((tk_callback_t)update_progress_bar, args, TRUE);
sleep_ms(30);
}
return NULL;
}
void* test_thread2(void* args) {
int nr = 500000;
while ((nr-- > 0) && (!s_app_quit)) {
tk_run_in_ui_thread((tk_callback_t)update_progress_bar, args, FALSE);
sleep_ms(30);
}
return NULL;
}
static ret_t on_idle(const idle_info_t* idle) {
return update_progress_bar(WIDGET(idle->ctx));
}
void* test_thread3(void* args) {
int nr = 500000;
while ((nr-- > 0) && (!s_app_quit)) {
idle_queue(on_idle, args);
sleep_ms(30);
}
return NULL;
}
static ret_t on_timer(const timer_info_t* timer) {
return update_progress_bar(WIDGET(timer->ctx));
}
void* test_thread4(void* args) {
int nr = 500000;
while ((nr-- > 0) && (!s_app_quit)) {
timer_queue(on_timer, args, 30);
sleep_ms(30);
}
return NULL;
}
Примечание:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )