LINUX.ORG.RU

[gtk+] теперь g_io_scheduler_job_send_to_mainloop


0

0

Доброго времени суток. Удалось наконец-то запустить функцию в отдельном потоке, но не теперь встала другая проблема:

Теперь мне нужно все что я загрузил с помощью этой функции, уже в основном потоке отобразить изображение в GtkAnimView. Делаю так:

Сама функция для загрузки из стрима:

void loading(GtkWidget* widget ,MainWin* mw)
{   
    GInputStream* input_stream;

    input_stream = g_file_read(loading_file, mw->generator_cancellable, NULL);  
    mw->animation = load_image_from_stream(G_INPUT_STREAM(input_stream), mw->generator_cancellable);    

    g_input_stream_close(input_stream, mw->generator_cancellable, NULL);
    g_object_unref (input_stream);  
}

Теперь запускаю ее в дургом потоке:

gboolean main_win_open( MainWin* mw,  ZoomMode zoom )
{               

    JobParam* param1 = malloc(sizeof(JobParam));
    param1->widget = NULL;
    param1->mw     = mw;

    g_io_scheduler_push_job (job_func1, param1, NULL, G_PRIORITY_HIGH, param1->mw->generator_cancellable);
}

Cама job_func1, здесь же пытаюсь запусить в основной поток функцию set_image с помощью g_io_scheduler_job_send_to_mainloop:

gboolean job_func1(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data)
{
    JobParam* param = (JobParam*)user_data;

    while (g_cancellable_is_cancelled(cancellable) == FALSE)
    {
        loading(NULL, param->mw);       
        g_cancellable_cancel (param->mw->generator_cancellable);
    }

    // переход в основной поток
    g_io_scheduler_job_send_to_mainloop(job, set_image, param, NULL);
    g_cancellable_cancel (param->mw->generator_cancellable);
}

set_image:

void set_image(JobParam* param)
{
   gtk_anim_view_set_anim (param->mw->aview, param->mw->animation);
}

Запускаю программу. Вызываю все это дело. Изображение грузится и отображается нормально. Но если попытаться загрузить другое изображение то отображается почему то только первое. Причем loading_file меняется каждый раз.

Спасибо.


Сейчас заметил, почему то loading вызывается только один раз. Видимо где-то cancell срабатывает не вовремя.

shk
() автор топика

Переделал job_func1:

gboolean job_func1(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data)
{
    JobParam* param = (JobParam*)user_data;

    while (g_cancellable_is_cancelled(cancellable) == FALSE)
    {
        loading(NULL, param->mw);       
        break;
    }

    g_io_scheduler_job_send_to_mainloop(job, set_image, param, set);
}

В этом случае начинает выполнятся set_image много много раз, не пойму почему...

shk
() автор топика
Ответ на: комментарий от shk

> Сейчас заметил, почему то loading вызывается только один раз. Видимо где-то cancell срабатывает не вовремя.

return TRUE или return FALSE в функции, возвращающей gboolean (которая job_func1) кто делать будет?

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.