Многопоточное приложение с gtkD

Я некоторое время играю с 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 ответ

Решение

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

Другие вопросы по тегам