Что такое asyn c область для делегата в Vala? - PullRequest
2 голосов
/ 04 марта 2020

Я пытаюсь asyn c примеров с сайта проекта GNOME . Я получаю следующее предупреждение, которое не понимаю, как исправить.

async.vala:8.2-8.17: warning: delegates with scope="async" must be owned

Код

async double do_calc_in_bg(double val) throws ThreadError {
    SourceFunc callback = do_calc_in_bg.callback;
    double[] output = new double[1];

    // Hold reference to closure to keep it from being freed whilst
    // thread is active.
    // WARNING HERE
    ThreadFunc<bool> run = () => {
        // Perform a dummy slow calculation.
        // (Insert real-life time-consuming algorithm here.)
        double result = 0;
        for (int a = 0; a<100000000; a++)
            result += val * a;

        output[0] = result;
        Idle.add((owned) callback);
        return true;
    };
    new Thread<bool>("thread-example", run);

    yield;
    return output[0];
}

void main(string[] args) {
    var loop = new MainLoop();
    do_calc_in_bg.begin(0.001, (obj, res) => {
            try {
                double result = do_calc_in_bg.end(res);
                stderr.printf(@"Result: $result\n");
            } catch (ThreadError e) {
                string msg = e.message;
                stderr.printf(@"Thread error: $msg\n");
            }
            loop.quit();
        });
    loop.run();
}

Предупреждение указывает на переменную run внутри асинхронной c функция. Кому или чему нужно владеть? Ссылка на закрытие?

1 Ответ

2 голосов
/ 04 марта 2020

Делегат должен постоянно иметь четко определенного владельца. Сообщение об ошибке немного вводит в заблуждение.

Чтобы исправить его, необходимо явно передать право владения делегатом конструктору потока:

new Thread<bool>("thread-example", (owned) run);

Вместо

new Thread<bool>("thread-example", run);

См. Также: https://wiki.gnome.org/Projects/Vala/Tutorial#Ownership

PS: сгенерированный код C в обоих случаях подходит. (по крайней мере, с vala c 0,46,6)

...