SOAP Web Servis Yaşam Döngüsü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen mrmarman »

Uygun bir zaman bulunca bir örnek hazırlayıp burada paylaşırım.
Örnek bir ini dosyasını okuyup, her yeni thread'ind bu ini dosyasını açmadan ilk okunan veriyi paylaşatığı cinsten basit bir kurgu olacak.
Resim
Resim ....Resim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Hocam valla böyle bir örnek gönderirseniz gerçekten beni büyük bi dertten kurtarmış olacaksınız.
Şimdiden teşekkür ederim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen mrmarman »

Hocam ancak fırsatım oldu basit bir şekilde daha önce bildirdiğim INI projesini yaptım denedim beklediğim şekilde doğru çalıştı.
Projeyi bu linkten indirebilirsin.
Bence sen Tiger ile iletişiminde sorunu aramalısın.

- CLASS'ı şöyle yaptım. Sonuçları rahatça takip edebilmen için Form1 üzerindeki Memo1'e her adımı logladım.

Kod: Tümünü seç

  tTigerHelper = Class (TObject)
  private
    FSonuc : String;
    Function  FSonucFunc: String;
    procedure FKaydet( strDeger: String );
  public
    property Sonuc : string read FSonucFunc;
    property Kaydet: string write FKaydet;
    constructor Create;
    destructor  Destroy; Override;
  End;
  
{ tTigerHelper }

constructor tTigerHelper.Create;
Var
  INI : TINIFile;
begin
  INI := TINIFile.Create( ChangeFileExt( ParamStr(0), '.INI' ) );
    FSonuc := INI.ReadString( 'MAIN', 'Deger', '' );
  INI.Free;
  Form1.Memo1.Lines.Add('TigerHelper Create Edildi. Değer okundu... : "' + FSonuc + '"');
end;

destructor tTigerHelper.Destroy;
begin
  Form1.Memo1.Lines.Add('TigerHelper Destroy Edildi. ');
  Inherited; 
end;

procedure tTigerHelper.FKaydet(strDeger: String);
Var
  INI : TINIFile;
begin
  INI := TINIFile.Create( ChangeFileExt( ParamStr(0), '.INI' ) );
    INI.WriteString( 'MAIN', 'Deger', strDeger );
  Form1.Memo1.Lines.Add('TigerHelper Değer yazıldı... : "' + strDeger + '"');
    FSonuc := strDeger;
  INI.Free;
end;

function tTigerHelper.FSonucFunc: String;
begin
  Result := FSonuc;
end;  
iki adet Action tanımladım.

Birincisi /inioku

Kod: Tümünü seç

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  if xTigerHelper = nil then
    xTigerHelper := tTigerHelper.create;

  Response.Content := 'INI Değeri = "'+ xTigerHelper.Sonuc + '" olarak okundu...';
  Handled := True;
end;
İkincisi /inikaydet?deger=string-ifade

Kod: Tümünü seç

procedure TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  if xTigerHelper = nil then
    xTigerHelper := tTigerHelper.create;

  xTigerHelper.Kaydet := Request.ContentFields.Values['deger'];
  Response.Content := 'INI Değeri = "'+ xTigerHelper.Sonuc + '" şeklinde yeniden yazıldı!!!';
  Handled := True;
end;
İşlemi kendin de dene.
(1) Sunucu'yu çalıştır, START butonuna basarak aktif hale getir.
(2) Bir web browser aç oradan

Kod: Tümünü seç

http://127.0.0.1:2048/inioku
yaz.
(3) 1 nolu Action inioku devreye girecek ve daha önce xTiger nil olduğundan ilk defa create edilecek INI dosyadaki değer okunacak ve bir String değişkene depo edilecek. Aynı zamanda browser ekranında bu değeri response ederek sana gösterecek.
(4) kaç tane browser açarsan o kadar kere bu depo edilen değeri gösterecek ama INI dosyadan asla okumayacak.
(*) şöyle test edebilirsin. Sunucu çalışıyorken ve en az bir kere inioku demişken (xTiger create edilmiş ve depo edilmiş halde yani) INI dosyasını bir NoteDefteri ile açıp değeri elinle değiştir. Yine inioku dediğinde eski depo edilmiş değeri okuyacaksın. Bu da xTiger'in tutarlı olduğunun garantisi.
(5) 2 nolu action inikaydet'tir. yeni değer yazmak için browser'a şöyle yaz.

Kod: Tümünü seç

http://127.0.0.1:2048/inikaydet?deger=stringifade
Bu da yeni verdiğin değeri INI'ye yazacak, aynı zamanda depo edilen değeri güncelleyecektir.

Şimdi konu daha da anlaşılır oldu umarım.
Resim
Resim ....Resim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Muharrem hocam Allah sizden razı olsun. Deneyip hemen haber vericem.
İnşallah yaptığınız örneği benim projeye uyarlayabilirim.

Çok teşekkür ederim hocam.
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Muharrem hocam merhaba.
Sizin gönderdiğiniz örnek ile ben baya ilerledim. Hatta adoquery ile test filan yaptım aynen sizin yaptığınız gibi çalışıyor.
Fakat bu logo tiger'ın application nesnesi bir türlü olmadı.
İlk istekte sorun yok çalışıyor fakat ikinci istek geldiğinde hata dönüyor. Bunuda ilk istek yaparken görev yöneticisinden baktım tiger'ın application nesnesini çalışan uygulamalar arasına getiriyor sonrasında işlem bitince kapatıyor kendini. Ama benim hafızadaki xtiger1 olarak verdiğim nesne duruyor. Her istekte login olmamam için bu application nesnesinin hep login durumda ayakta olması lazım hocam.
Valla işin içinden çıkamadım.

Kod: Tümünü seç

  
  TigerHelper=class(tobject)
   public
    constructor create;
    destructor destroy;override;
    var
    TigerObje:TUnityApplication;
  end;

implementation
var
xtiger1:TigerHelper;


function TLogoTigerObjeServisi.kartac(kart: string): string;
 var
 salesdis : OleVariant;
 transactions: OleVariant;
 i : Byte;
begin
if xtiger1=nil then
  begin
    xtiger1:=TigerHelper.create;
  end;
salesdis := xtiger1.TigerObje.NewDataObject(17); //ilk istekte bu doğru çalışıyor ikincisinde uygulama sunucuya bağlanmamış hatası veriyor.
salesdis.New;
salesdis.DataFields.FieldByName('TYPE').Value :=8;
...............


constructor TigerHelper.create;
begin
TigerObje:=TUnityApplication.Create(nil);
TigerObje.Login('kullanıcı adı','şifre',01,1);
end;

destructor TigerHelper.destroy;
begin
  inherited;
end;

end;


Bu unityapplication nesnesini main forma alıyım dedim hocam bu seferde buradan form1 e erişmek istediğimde uygulama başka iş parçacığı için sıraya konmuş diye hata döndü.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen Kuri_YJ »

Selamlar,

Bu tür işlemler biraz karışıktır ve ThreadList mantığında LOCK'lamalar gerek. Ayrıca TigerObje dediğiniz nesne GLOBAL tanımlanmalı. Ancak, buna erişimde (her bir thread erişim yapmadan önce LOCK'lamalı). Yani bir tane main nesne yarattıktan sonra onu destroy ettirmeyin Globalde bellekte kalsın ve o nesneye daha sonra LOCK'layarak erişim sağlayın.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Hocam işte benim sorunumda bu nasıl yapılacağını bilmiyorum. Global tanımlama ve lock lama için bir örnek verebilirseniz gerçekten çok sevinirim.
Teşekkürler.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen Kuri_YJ »

Selamlar,

Valla gözüm iş uzun şöyle kestirmeden bir datamodul oluşturun oluşturduğunuz datamodul'ün var kısmına kendi nesnenizi tanımlayın. Critical Section olayını inceleyin. Multi Threading and Critical Section şeklinde biraz google araştırın. Ben benzer bir örnek bulursam gönderirim. Bizim çok uğraştığımız bir konu bu ama ayıklanıp sana verebileceğim bir örneğim malesef yok !...

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen mrmarman »

Hocam ben ne yaptım? Aralara memo'ya sınuç bildiren detaylar ekledim. Sen de her hareketi böyle memoya at ki çağrı sırasında neler oluyor anlamaya çalış. Mesela yeniden create mi ediyor, arada bir yerlerde class'ı mı uçuruyor? Bunu sadece kendin deneyip yanılarak bulabilirsin. Bizim yapabileceğimiz bir şey yok, sen de biliyorsun.
Resim
Resim ....Resim
Cevapla