Thread overview
finally blogunun çalışması
Feb 11, 2016
zafer
Feb 18, 2016
zafer
Mar 04, 2016
zafer
February 11, 2016

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();
	}
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2016

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2016

Üstteki mesaj benim fakat forumda adım erdem olarak görünüyordu 5 dakika önceye kadar.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2016

Eyvah! Forumun veri tabanı tabloları bozuldu herhalde! :) Biraz sonra tamir ettirmeye çalışırım.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2016

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 18, 2016

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.
    Alıntı:

>

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 $

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

  2. 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?

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

>

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 18, 2016

Alıntı (ozanselte:1455206690):

>

Ü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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 19, 2016

Alıntı (zafer):

>
  1. 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.

Alıntı:

>
  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.

Alıntı:

>
  1. 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.

Alıntı:

>
  1. 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.

Alıntı:

>
  1. Ö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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 04, 2016

Alıntı (acehreli:1455870940):

>

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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 04, 2016

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]