Forum: D Programlama Dili RSS
finally blogunun çalışması
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: finally blogunun çalışması
Merhaba,

Aşağıdaki gibi bir kodum var. Sonsuz döngüde devam ederken CTRL+C ile programı kırdığımda finally blogu çalışır mı?

import std.stdio;
import core.thread;
import dgpio;
 
void main()
{
    writefln("Raspberry PI Led");
 
    GPIO pin18 = new GPIO(18);
    try
    {
        while(true)
        {
            pin18.setOutput();
 
            pin18.setHigh();
            Thread.sleep(2.seconds);
 
            pin18.setLow();    
            Thread.sleep(2.seconds);
        }
    }
    finally
    {
        pin18.deactivate();
    }
}
https://github.com/zafer06 - depo
ozanselte #2
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam çalışmıyor. Fakat dgpio açısından artık sorun çıkartmıyor. Eskiden deaktive edilmeyinde hata veriyordu. Program kapanınca pin aktif kalır. Kapatma işini başka bir kodla yapabilirsiniz. Henüz ben de bunun için bir yol bulamadım.

import dgpio;
 
void main()
{
    GPIO pin18 = new GPIO(18);
    pin18.deactivate();
}

Ali hocam bu arada ben ozanselte fakat erdem adlı kullanıcıdan giriş yapmış görünüyorum.
Bu mesaj erdem tarafından değiştirildi; zaman: 2016-02-11, 07:48.
ozanselte #3
Kullanıcı başlığı: Ozan Şelte
Üye Haz 2013 tarihinden beri · 12 mesaj · Konum: Bodrum
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Üstteki mesaj benim fakat forumda adım erdem olarak görünüyordu 5 dakika önceye kadar.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Eyvah! Forumun veri tabanı tabloları bozuldu herhalde! :) Biraz sonra tamir ettirmeye çalışırım.

Ali
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bunun için signal handler kullanılır.
import std.stdio;
import std.string;
import std.exception;
import std.algorithm;
import core.thread;
import core.stdc.signal;
 
bool devam_mı = true;
 
const sonlanmaSinyalleri = [ SIGINT, SIGTERM ];
 
extern (C) void sig_handler(int signo) nothrow @nogc @system
{
    debug writeln("Sinyal %s alındı.", signo);
 
    if (sonlanmaSinyalleri.canFind(signo)) {
        devam_mı = false;
 
    } else {
        debug writeln("Bu sinyalle ilgilenmiyoruz.");
    }
}
 
void main() {
    // Sinyal işlevimizi belirtelim
    foreach (s; sonlanmaSinyalleri) {
        const sonuç = signal(s, &sig_handler);
        enforce(sonuç != SIG_ERR, format("%s numaralı sinyali ayarlayamadım."));
    }
 
    // try-catch-finally yerine bunu da kullanabiliriz. (Perde arkasından aynı
    // işi yapar.)
    scope(exit) writeln("Çıkıyoruz...");
 
    for (size_t i = 0; devam_mı; ++i) {
        writeln(i);
        Thread.sleep(1.seconds);
    }
}
Ali
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
ozanselte on 2016-02-11, 08:04:
Üstteki mesaj benim fakat forumda adım erdem olarak görünüyordu 5 dakika önceye kadar.

Elle düzelttim. Herhalde forumun HostGator tarafından cached mode'a sokulmasıyla ilgiliydi.

Ali
zafer #7
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Biraz geç oldu ama kaldığımız yerden devam.  Ali, bilgi ve örnek için teşekkürler. C ve sinyal işleme konusunda bilgim olmadığı için örnek kodlamada anlamadığım kısımlar oldu, bunlara açıklık getirebilir misin?

1. sonlanmaSinyalleri degişkeni enum tipinde olsa daha iyi olmaz mı?

2. sig_handler fonksiyonu içindeki debug satırlarını çalıştıramadım, -debug anahtarı ile derlemeye çalıştığımda aşağıdaki hatayı veriyor.
zafer@zafer-pc ~/Projeler/d/signal_handler $ dmd main.d -w -debug
main.d(17): Error: @nogc function 'main.sig_handler' cannot call non-@nogc function 'std.stdio.writeln!(string, int).writeln'
main.d(23): Error: @nogc function 'main.sig_handler' cannot call non-@nogc function 'std.stdio.writeln!(string).writeln'
main.d(17): Error: 'std.stdio.writeln!(string, int).writeln' is not nothrow
main.d(23): Error: 'std.stdio.writeln!(string).writeln' is not nothrow
main.d(12): Error: function 'main.sig_handler' is nothrow yet may throw
zafer@zafer-pc ~/Projeler/d/signal_handler $

3. Sinyal işleme nasıl çalışıyor anlamadım, kısaca anlatabilir misin?

4. sig_handler fonksiyonunun içindeki devam_mı değişkenine benim ihtiyacım yok ancak bunu kaldırınca programı CTRL+C ile sonlandıramıyorum, neden?

5. Örnek kodu RaspberryPI üzerinde GDC ile derlemeye çalıştığımda aşağıdaki hatayı aldım.
pi@raspberrypi ~/projects/sig_handler $ gdc main.d
main.d:12: error: user defined attributes cannot appear as postfixes
main.d:12: error: semicolon expected following function declaration
main.d:13: error: no identifier for declarator system
main.d:13: error: semicolon expected, not '{'
main.d:13: error: Declaration expected, not '{'
main.d:16: error: Declaration expected, not 'if'
main.d:19: error: unrecognized declaration
https://github.com/zafer06 - depo
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zafer:
3. Sinyal işleme nasıl çalışıyor anlamadım, kısaca anlatabilir misin?

Programın işleyişi gönderilen sinyallerle kesintiye uğratılabilir. Bir kaç örnek: Ctrl-C gibi klavyeden kesme isteği için SIGINT, "sona er" emri için SIGTERM, başlatılan alt program sonlandığında SIGCHLD, vs.

Sinyallerin bir iyi tarafı, program ne kadar meşgul olursa olsun hemen haber alınabilmesidir. İşleyiş durur, gelen sinyal için ayarlanmış olan işlev çalıştırılır, ve ondan sonra program kaldığı yerden devam eder.

Sinyal işlevi işletilirken bile sinyal gelebileceğinden ya program ya da sistem içinden çıkılmaz duruma düşebilir. O yüzden sinyal işlevinin son derece basit olması gerekir. Hatta, sinyal işlevi içerisinden güvenli olarak yalnızca belirli POSIX işlevlerinin çağrılabilir. Şurada "Async-signal-safe functions" başlığı altında görülüyorlar:

  http://man7.org/linux/man-pages/man7/signal.7.html

Neyse ki biz bu örnekte yalnızca bir modül değişkenine atama yapıyoruz.

Sonuçta da programımız Ctrl-C'ye basıldığından haberdar oluyor ve o değişken yoluyla bunu kendisin için kaydediyor.

1. sonlanmaSinyalleri degişkeni enum tipinde olsa daha iyi olmaz mı?

Bu örnekte farketmez ama genelde dizileri enum yapmak istemeyiz çünkü o diziden tek adet değil, her kullanıldıkları yerde tekrar tekrar oluşturulur. enum diziler bir anlamda C makroları gibidir: Her kullanıldıkları yere [ SIGINT, SIGTERM ] yazılmış ve böylece o yerlerde geçici diziler oluşturulmuş gibi olur.

Öte yandan, elemanları immutable yapılabilirdi ama referans içermeyen (yani, tamamen değer türü olan) elemanlar için const ile immutable arasında bir fark yok.

2. sig_handler fonksiyonu içindeki debug satırlarını çalıştıramadım, -debug anahtarı ile derlemeye çalıştığımda aşağıdaki hatayı veriyor.

Ben de derleyemedim. :) debug ile derlenir sanmışım ama olmadı. O işlevden yazdırmak yerine bir modül değişkenine atama yapıp sonra main içinden o değişkeni yazdırabiliriz.

4. sig_handler fonksiyonunun içindeki devam_mı değişkenine benim ihtiyacım yok ancak bunu kaldırınca programı CTRL+C ile sonlandıramıyorum, neden?

Sinyalin alındığını devam_mı'ya atayarak bildiriyoruz. main de o değere göre sonlanıyor. Benzer bir şey yapacaksan senin de devam_mı gibi bir değişkene ihtiyacın olacak.

Bir başka deyişle, sinyal geldiğinde main kesintiye uğrar ve sinyal işlevi işletilir ama main hemen sonra yine işlemeye başlar. Sonlanıp sonlanmamak yine de main'e kalmıştır. O yüzden, devam_mı'nın değerine bakıyor.

5. Örnek kodu RaspberryPI üzerinde GDC ile derlemeye çalıştığımda aşağıdaki hatayı aldım.

Yine gdc'nin sürümünden şüpheleniyorum. Herhalde @nogc'yi anlamıyor (veya @system'ı). Eğer o gdc'yi kullanmak zorundaysan bir de @nogc'yi kaldırarak dener misin. (Tabii başka hata alırsan ve o hata mesajı @nogc içeriyorsa tahminimde yanılmışım demektir. :) )

Ali
zafer #9
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli on 2016-02-19, 00:35:
Yine gdc'nin sürümünden şüpheleniyorum. Herhalde @nogc'yi anlamıyor (veya @system'ı). Eğer o gdc'yi kullanmak zorundaysan bir de @nogc'yi kaldırarak dener misin. (Tabii başka hata alırsan ve o hata mesajı @nogc içeriyorsa tahminimde yanılmışım demektir. :) )

Yanıtlar için teşekkürler, geç cevap için kusura bakma biraz yoğunluk var :)

Tahmininde yanılmamışsın @nogc, .canFind ve enforce işlevlerini kaldırınca program sorunsuz derlendi ve istediğim gibi çalıştı. Gerçi Ctrl+C yaptığımda biraz gecikme oluyor ama sorun değil, işlevi istediğim gibi yerine getiriyor.

RaspberryPI üzerinde ARM işlemci ile çalışıyorum ve bildiğim kadarıyla sadece GDC bu platforma destek veriyor, yanılıyor muyum?
https://github.com/zafer06 - depo
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
dmd'nin desteklemediğinden eminim ama diğerlerini biliyorum. llvm Raspbian diye aratınca en azından clang'in desteği olduğunu görüyorum ama ldc'nin durumunu da bilmiyorum.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 03:03:16 (UTC -08:00)