1

Konu: Terminallerde Programın Çalışıp Çalışmadığının Kontrol Edilmesi

Anamakineden terminallerde programın çalışıp çalışmadığını nasıl kontrol edebiliriz.

2

Re: Terminallerde Programın Çalışıp Çalışmadığının Kontrol Edilmesi

terminallerde programin acik olup olmadiginin kontrolu yada askıda kalan (normal cikis yapmaya) kullanıcıları tespiti icin ben kullanici adlarinin tutuldugu tabloda LOGGED = .F. seklinde bir alan kullaniyorum .
programa giris aninda login formumum command buton kodu asagidaki gibi bu yolla giris yapmis olan  kullanici LOGGED = .T. olarak tabloda isaretleniyor ve uygulama boyunca da sistemdeki kullanicilar
logged = .t. filtrelemesi ile vs gorulebiliyor

Visual Fox Pro
Use ADDBS(m.gcData)+'user' In 0 Shared Again 

Select User
If Empty(Thisform.text1.Value)
    Messagebox("Kullanıcı Adı Boş Geçilemez !!!",16,"Kullanıcı Giriş Hatası")
    Return
Endif
Locate For User.KULL = Alltrim(Thisform.text1.Value)
If Found() And Alltrim(User.SIFRE) == Alltrim(Thisform.text2.Value)
    If User.logged=.T.
        Messagebox("Bu Kullanıcı Sisteme Giriş Yapmış !!!",16,"Kullanıcı Giriş Hatası")
        Return
    Endif
    Thisform.cUser = Alltrim(User.KULL)
    Thisform.cLevel = Alltrim(User.Level)
    Store User.Level To gclevel
    Store Alltrim(User.KULL) To gckullanici
    Select User
    Replace User.logged With .T. In 'user'
    Thisform.Release
Else
    Messagebox("Kullanıcı Adı Yada Şifre Hatalı...",16,"Hata !!!",1.5)
    Thisform.text1.Value = ""
    Thisform.text2.Value = ""
    Thisform.text1.SetFocus
Endif


çıkış yordaminda ise asagidaki gibi bir kodlama kullanarak cıkıs yapan kullanıcının durumunu .F. a getiriyorum .

Visual Fox Pro
If Messagebox("Programdan Çıkılacak Onaylıyormusunuz ?",4+32+256,_Screen.Caption) = 6

    If ! Used("user")
        Use Addbs(m.gcData)+'user' In 0 Shared Again
        Replace User.logged With .F. For User.kull=m.gckullanici In 'user'
    Endif
Clear Events
    Do kapanisyap
Endif


ayrıca login formumda kullandıgım bir combobox tada

Visual Fox Pro
* rowsource

select distinct kull,iif(logged=.t.,'Aktif','Pasif') from  addbs(m.gcdata)+'user' order by kull into curs
combo1
*rowsource type
3-SQL Statement


seklinde combo calistirarakta programa giris anında askıda kalan ( normal cikis yapmayan ) kullanicilari ve digerlerini gorebiliyorum. buradaki Aktif lik ve Pasiflik durumu  LOGGED = .T. mantıgına gorede sekillenmis oluyor .
Ama bu yontem 50% aktif kullanicilari gosterebilirken , normal cikis yapmayarak aktif gozukenleri de listeledigi icin tam arzulanan cozum olmayabilir.
Ama bunun için farklı çözümlerde mevcut aşağıda örnekten yola çıkarak sırayla kayitli terminallerdeki exelerin calisip calismadigi da bulunabilir

Visual Fox Pro
Local LnMultirun,LcExeName

LnMultirun = 0
LcExeName = "soykan.exe"
If IsRunning(m.LcExeName)
    Messagebox("Program Zaten Çalışıyor...!!!")
    Quit
Endif
FUNCTION IsRunning(tcSemaphoreName)
LOCAL lpszSemName
DECLARE INTEGER GetLastError IN win32API
DECLARE INTEGER CreateSemaphore IN WIN32API ;
    STRING @ lpSemaphoreAttributes, ;
    LONG lInitialCount, ;
    LONG lMaximumCount, ;
    STRING @ lpName
hsem = CreateSemaphore(0,0,1,tcSemaphoreName)
RETURN (multirun # 0 .AND. GetLastError() == ERROR_ALREADY_EXISTS)

3

Re: Terminallerde Programın Çalışıp Çalışmadığının Kontrol Edilmesi

mailine ornek kodlar gonderdim
ayrıca
http://www.vfpserver.com adresinden indirebilecegin uygulama ile acik dosya kontrolu vs leri monitoring eden bir uygulama var buda bir nevi VFP SQL Monitor smile
hangi tablolar acik hangi kullanicilar kullaniyor vs

4

Re: Terminallerde Programın Çalışıp Çalışmadığının Kontrol Edilmesi

FUNCTION IsRunning(tcSemaphoreName)
sadece kendi yarattıgin semaphorelari kontrol ediyor.

www.universalthread.com downloadsda, bu is icin bir kod olacakti. Benim de var ama public degil ne yazik ki. Isin temel mantigi eskiden Novel'in uyguladigi "watchdog" yontemi. Acik oldugunu iddia eden terminallere sinyal gonderip cevap bekliyorsun, cevap vermeyen "olu".