Многопоточное приложение с 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 не поддерживает общий доступ и, вероятно, некоторое время не будет.