LINUX.ORG.RU

[gtk+] Загрузка данных в отдельном потоке


0

0

Доброго времени суток ЛОР. Стоит задача запустить в отдельном потоке функцию загрузки данных от главной формы.

Для этого использую GIOScheduler.

Ест функция самой загрузки:

void load(GInputStream* input_stream, GCancellable* cancellable)
{
   ...
}

Сама функция загрузки работает 100%. Затем есть функция которую нужно отправить в отдельный поток:

void loading(MainWin* mw)
{
  GInputStream* input_stream = g_file_read(loading_file, mw->generator_cancellable, NULL);
  mw->data = load(G_INPUT_STREAM(input_stream), mw->generator_cancellable);
}

Пытаюсь отправить следующим образом:

g_io_scheduler_push_job( job_func1, mw, NULL, G_PRIORITY_DEFAULT, mw->generator_cancellable);

Где job_func:

static void job_func1(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data)
{
    MainWin* mw  = (MainWin*)user_data;
	while(!g_cancellable_is_cancelled(mw->generator_cancellable))
	{
		g_io_scheduler_job_send_to_mainloop(job, loading, mw, NULL);
	}
}

При запуске программы, при вызове loading ничего данные не загружаются + быстро утекает память.

В чем может быть проблема. 3 суток сижу ничего не могу придумать.

Спасибо


Как минимум не верный прототип функции, должен быть:

gboolean            (*GIOSchedulerJobFunc)(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data);

Предположу, что работает она у тебя бесконечно. Не понятно только почему данных нет.

goose
()

Я с g_io_scheduler никогда не работал, но мне кажется ты вообще лажу делаешь, вызывая g_io_scheduler_job_send_to_mainloop. Тебе надо просто loading вызвать.

goose
()

По-моему, я тебе уже советовал прочитать про GObject и не только, чтобы иметь представление о работе GLib, но ты так и не послушался и продолжаешь творить какую-то хренотень в коде методом тыка. Во-первых, как тебе уже сказали, ты зачем-то дергаешь g_io_scheduler_job_send_to_mainloop, что сводит на нет все твои попытки загрузить данные в отдельном потоке - все у тебя обрабатывается в основном потоке. Используй GThread. Во-вторых, ты нигде не проверяешь результат открытия потока. В-третьих, я подозреваю, что течет в функции load (), так что показывай код.

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