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