Sadece 10 satır daha ekleyerek std.concurrency sınıfını by-pass ettim. Bunun için değişkenleri ve yardımcı işlevleri TEST sınıfı içine almak gerekiyor. Böylece core.Thread sorunsuz çalıştığı gibi paylaşım (shared) olayından kurtuluyoruz. Ancak 'send()' işlevi yerine 'birYapı{}''da sonuGeldi_mi Boolean değişkenine ihtiyaç duydum. Netice sanki biraz farklı ve uzaklaşma hızlı:
/*
sleepTest2t.d (19.04.2012)
*/
import core.thread;
import std.random, std.stdio: writeln;
class TEST {
public this(int birSayı, int ikiSayı) {
birincinin.Beklemesi = birSayı;
ikincinin.Beklemesi = ikiSayı;
}
private struct birYapı {
int Sayımı, Beklemesi;
bool sonuGeldi_mi = false;
} birYapı birincinin, ikincinin;
public void bir () { auto Tbir = new Thread(&birinci); Tbir.start(); }
public void iki () { auto Tiki = new Thread(&ikinci); Tiki.start(); }
private void birinci () {
scope(exit) {
writeln(" - birinci() x ", ++birincinin.Sayımı, " kez girdi...");
birincinin.sonuGeldi_mi = true;
}
writeln("Ben (1.) birinciyim ve ", birincinin.Beklemesi,
" saniye beklemeliyim!");
Thread.sleep(dur!"seconds"(birincinin.Beklemesi));
}
private void ikinci () {
scope(exit) {
writeln(" - ikinci() x ", ++ikincinin.Sayımı, " kez girdi...");
ikincinin.sonuGeldi_mi = true;
}
writeln("Ben (2.) ikinciyim ve ", ikincinin.Beklemesi,
" saniye beklemeliyim!");
Thread.sleep(dur!"seconds"(ikincinin.Beklemesi));
}
}
void main() {
auto rasgele = () => uniform(1, 10);
auto Deneme = new TEST (rasgele(), rasgele());
Deneme.bir;
Deneme.iki;
while (true) {
if (Deneme.birincinin.sonuGeldi_mi) {
Deneme.birincinin.sonuGeldi_mi = false;
Deneme.birincinin.Beklemesi = rasgele();
Deneme.bir;
}
if (Deneme.ikincinin.sonuGeldi_mi) {
Deneme.ikincinin.sonuGeldi_mi = false;
Deneme.ikincinin.Beklemesi = rasgele();
Deneme.iki;
}
}
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]