Многопоточное приложение с gtkD - PullRequest
2 голосов
/ 27 декабря 2011

Я некоторое время играю с gtkD и параллельно изучаю D2 / Phobos. Вчера я искал модуль std.concurrency и пытался написать игрушечный многопоточный просмотрщик фракталов, но проблема в том, что я не вижу, как многопоточность работает с gtkD.

Теперь у меня есть это:

import std.concurrency;

class TestMainWindow : MainWindow
{
    this() {
        super("test");
        ...
        spawn(&worker);
    }

    public void notify() {
        m_progress.pulse();
    }

    private ProgressBar m_progress;
}

shared(TestMainWindow) window;

main(string[] args) {
    Main.init(args);
    window = new shared(TestMainWindow)();
    Main.run();
}

void worker() {
    for (int i = 0; i < 20; ++i) {
        (cast(TestMainWindow) window).notify();
        Thread.sleep(dur!"msecs"(200));
    }
}

В книге Андрея, в главе о параллелизме, есть парадигма передачи сообщений, которую я хочу применить, но проблема в том, что основной цикл gtk скрыт от меня. Мне не нравится приведенный выше код, потому что его некрасиво бросать на нераспространенные и, вероятно, небезопасные. Итак, есть ли какой-нибудь способ наследовать «независимый от потоков» класс, сделать его ориентированным на потоки, и каковы стандартный механизм в gtkD для программирования многопоточных приложений? Я видел модуль gthread.Thread, но его роль, по-видимому, заключается только в качестве интерфейса с внешними возможностями многопоточности C gtk +.

1 Ответ

0 голосов
/ 27 декабря 2011

К сожалению, я почти уверен, что ответ - нет. GtkD был разработан до совместного использования и поддерживает как D1, так и D2. Кроме того, общий доступ настолько глючит, что его еще нельзя использовать. Таким образом, GtkD не поддерживает общий доступ и, вероятно, некоторое время не будет.

...