Forum
Merhabalar,
Şirket içerisinde otomatik kapanma programı hazırladık. Kodlar da herhangi bir problem yok. Programı Services dosyası oluşturduk ayrıca.
Şöyle bir problemimiz var, program bazı kullanıcılarda çalışmakta, bazı kullanıcılarda çalışmamakta. Kurulumu msi paketi şeklinde kuruyoruz, ve services.msc den ayarlamalarını yapıyoruz. Program, bazı kullanıcılarda; belirtilen saatler dışında çalışmaktadır. bunun yavaşlık ile olacağını düşünüyorum ama yavaşlık ile ilgili işlem ve upgrade yaptığımda da sorun düzelmedi, ayrıca pc leri update ettim ve TimeZone ayarlarını çalışan bilgisayara göre ayarladım. Ama bazı kullanıcılarda program devreye girmemektedir, bununla ilgili bir fikriniz varmıdır? Windows xp kullanıyorum ve işletim sistemi ile ilgili sorun olacağını düşünüyorum, kodlarda sorun olsaydı eğer bazı kullanıcılarda program çalışmazdı. Konu ile ilgili olarak yardımcı olabilir misiniz ?
teşekkürler.
Kodları görmeden bir şeyler söylemek pek mümkün gözükmüyor.
merhaba kodlar aşağıdaki şekildedir.
using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Timers;
// @2012
// Saat 22:00'dan sonra saat 07:30'a kadar 40 dakikada bir bilgisayarın kapatılması için uyarı veren windows servis.
namespace WindowsService4
{
public partial class Service1 : ServiceBase
{
#region
public Service1()
{
InitializeComponent();
}
System.Timers.Timer timer = new System.Timers.Timer();
//Bu timer windows servis Thread.Sleep() fonksiyonunu kabul etmediği için kullanılmıştır.
//Bir defaya mahsus çalışacaktır.
System.Timers.Timer timer2 = new System.Timers.Timer();
DateTime now;
protected override void OnStart(string[] args)
{
//Programın çalışmaya başladığı anı alacak
now = DateTime.Now;
int i;
if (DateTime.Today.AddHours(21).AddMinutes(20) > DateTime.Now)
{
//Eğer saat 21:20'dan önce ise saat 21:20'a kadar olan arayı milisaniye olarak alacak ve tek sefere mahsus çalışacak timer'a interval değeri olarak atayacak
//Bu sayede program saat 21:20'a kadar hiç çalışmayacak
i = (int)DateTime.Today.AddHours(21).AddMinutes(20).Subtract(DateTime.Now).TotalMilliseconds;
timer2.Elapsed += new ElapsedEventHandler(timer2_Elapsed);
timer2.Interval = i;
timer2.Enabled = true;
}
else
{
//Saat zaten 21:20'yi geçmiş ise program 40 dakika sonra yani saat 22:00'yi geçince çalışmaya başlayacak ilk defa ekran gözükecek
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Interval = 40 * 60000;
WriteEvent("Servis basladi.");
timer.Enabled = true;
}
}
void timer2_Elapsed(object sender, ElapsedEventArgs e)
{
//Eğer saat 21:20'den önce ise 21:20'ye kadar beklemesini sağlayan kod parçası burası
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Interval = 40 * 60000;
WriteEvent("Servis basladi.");
//Bu komut ile saat 22:00'den sonra her 40 dakikada bir kullanıcıya ekranı gösteren timer başlatılıyor
timer.Enabled = true;
//Bu blok bir kere çalıştıktan sonra tekrar çalışmayacak.
timer2.Enabled = false;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
//Programın çalışmaya başladığı günden bir sonraki gün sabah saat 7:30'a kadar her 40 dakikada bir ekranın gösterilmesi sağlanıyor
if (DateTime.Now < now.AddDays(1).AddHours(7).AddMinutes(30))
{
System.Diagnostics.Process yap = new System.Diagnostics.Process();
yap.EnableRaisingEvents = false;
//Kullanıcı arayüzünü sağlayan windows form uygulamasını setup projesine eklediğimizden aynı directory içinde yer alan uygulama çağırılıp kullanıcıya gösterilecek.
yap.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + "WindowsFormsApplication1.exe";
yap.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
//Olay görüntüleyicisine işlemin durumunu yazan kodlar
yap.StartInfo.ErrorDialog = true;
if (yap.Start() == false)
{
this.EventLog.WriteEntry("Seris start dosyasına ulaşılamdı");
}
else
{
this.EventLog.WriteEntry("Service başlatıldı");
yap.WaitForExit();
}
}
//Saat 07:30 olduysa kullanıcıya sormadan bilgisayarın kapatılması sağlanıyor
else
System.Diagnostics.Process.Start("shutdown", "-f -s");
}
protected override void OnStop()
{
timer.Enabled = false;
WriteEvent("Servis durduruldu.");
}
#endregion
#region Event Loglarını Yazdırma
//Olay görüntüleyiciye kayıt yazdırmak için hazır kodlar servisin çalışmasını anlamaya yardımcı olması için ekledim
private System.Diagnostics.EventLog OlayLog;
void WriteEvent(string islem)
{
OlayLog = new EventLog();
if (!System.Diagnostics.EventLog.SourceExists("ShutDownService"))
{
System.Diagnostics.EventLog.CreateEventSource("ShutDownService", "ShutDownService");
}
OlayLog.Source = "ShutDownService";
OlayLog.WriteEntry(islem, EventLogEntryType.Information);
}
#endregion
}
}
Hızlıca gördüğüm kadarıyla shutdown komut setini kullanıyorsunuz. Yönetici hakları olmadan veya o promt yönetici olmadan bu komut işletilemez. Kapanmayan pc'leri manuel deneyerek kontrol edin. Ayrıca microsoft'dan bu komut'un bağlı olduğu bir service var mı ona bakmak faydalı olabilir. Sizin .exe her bir makina da çalışmıyor da uzaktan ise remote servislerinin çalışması ve admin hakkını devralabiliyor olmalı.
Mesela yönetici olarak cmd promt açmadan bazı process'leri taskkill yapamazsınız. Çalışan bazı uygulamalarda taskkill yapmaya engelli olabilir bu da tabi shutdown yapamamayı sağlar. Bir process veya .exe bağımlılığının crash olması da bazen kill etmeyi engelliyor bu da kapatma işlemini durdurabiliyor yaşadım böyle şeyleri. Yine ayrıca o pc'lerin bios ACPI ayarı kapalı olabilir.
http://www.cozumpark.com/forums/thread/101600.aspx
'balık vermez, nasıl tutulabildiğine yönlendirir'
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız. Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz. Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************
Kardeş kaç gündür yazamıyorum, kusura bakma.
Bugün fırsat buldum, enine boyuna her halde bi yarım saatten fazla bir şeyler yazdım da elektrikler kesilince hepsi uçtu.
Elektrik kesiliyor yazdıkların gidiyor, internet kopuyor post ettiğin ne var ne yok gidiyor, yazıp yolladıktan sonra time-out oluyor yine yazdıkların gidiyor, post ediyorsun geçen süre içinde hata verecek mi vermeyecek mi diye neredeyse 1 dakka ekrana kilitlenmiş bekliyorsun, hele server'da az bir kasma varsa haydi bakam hayırlı işler.
Şu community server ne kadar rezil bir şey arkadaş. Bir aydır başıma bu 10. kezdir geliyor. O kadar yazıyorsun, lazımsa görsel ekliyorsun(gerekirse çiziyorsun), lazımsa hesap kitap yapıyorsun, tam emin değilsen yanlış yönlendirmemek için gerekirse üstüne birde sen araştırıyorsun. Sonuç? Hiç. Adamın hevesi kaçıyor yeminle başkada bir şey değil.
Okuyan kimse yanlış anlamasın, eminim ki sadece benim başıma geldiği için şu scripte bu kadar sövüyorum. Yoksa scripte bir auto draft eklentisi yazmayı akıl edemedikleri için telligent firmasına değil.
------------------------
Neyse kardeşim senin sorununu kısaca özetliyim. Timer'lara set ettiğin interval değerlerini matematiksel işlemlere tabi tuttuğun için belirttiğin sürelerde çalışmaması normal. İntervalleri bir kaç saniyeye düşürüp uygulamayı debug ettiğinde set ettiğin değerlerin belleğe yerleşmediğini görürsün. Bunun yanı sıra algoritmada çok fazla eksik ve hata var, bunlar yazılımsal olduğu kadar mantıksal hatalar.
http://www.dotnetspider.com/resources/39275-Automatic-shutdown.aspx şu linkteki kodları kullanarak temiz bir şey yazabilirsin. 40 dakikada bir kullanıcıya "Orda mısın?" diye sormasından ziyade input hook işlemi sonucunda yapılan son işlemden itibaren 40 dakikalık süre sonunda kullanıcı inaktifse oluşturduğun nag ekranı çıkıp son bir kez uyarı versin, bilgisayar başında kimse yoksa kapatsın.
Ayrıca uygulamayı arka planda sürekli çalışan bir servis olarak değil scheduled task içine 21:30 gibi bir saatte günlük çalışacak şekilde ayarlarsan daha sağlıklı çalışır. Arka planda çalışacak servis yazmak kolay iş değil, minimum sistem kaynağı kullanması gerekir. Bu yüzden o tür uygulamalar desen(pattern) metodlarına göre yazılır.
Danışman - ITSTACK Bilgi Sistemleri
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız.
Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz.
Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************