Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

Arkadaşlar merhaba;
Aşağıdaki kod ile uzak SQL sunucudaki image tipli alana pdf dosyası kaydediyorum. (Uzaktan kastım internet üzerinden farklı lokasyondaki bir makinaya)

Kod: Tümünü seç

procedure TFormYukle.ButtonKaydetClick(Sender: TObject);
var
X:TMemoryStream;
ZIP:TMemoryStream;
begin
 Panel2.Visible:=True;                        //Panel2 de sürekli çalışan bir progress bar var.
 X:=TMemoryStream.Create;
 X.LoadFromFile(cxTextEdit1.Text);
 ZIP:= TMemoryStream.Create;
 CompressStream(X,Z);                     //Boyutu düşürmek için göndermeden önce sıkıştırıyorum dosyayı
 ADOQInsert.Parameters[0].LoadFromStream(ZIP,ftBlob);                          
 ADOQInsert.ExecSQL;
 Panel2.Visible:=False;
end;
Bu kod düzgün şekilde çalışıyor.Dosyayı kaydediyorum sorunsuz.
Ancak uzak SQL sunucuya dosya gönderdiğim için işlem haliyle dosya boyutuna göre 1-2 dk. alıyor.
Bu 1-2 dk lık sürece program donmuş gibi kalıyor.Aslında donmuyor.1-2 dk sonra kayıt post edilince normale dönüyor.

Ben istiyorum ki bu 1-2 dk. lık sürede panel2 (haliyle içindeki progressbar) görünsün ve kullanıcı program dondu sanmasın.
Kayıt işlemi bitincede panel2 visible:=false ile kapansın.

Yukarıdaki kod çalıştığında panel2 görünüyor fakat program donup kaldığı için progressbar hareket etmiyor.

Çok şey mi istiyorum acaba?
Şimdiden teşekkürler.
hakanharbeli
Üye
Mesajlar: 76
Kayıt: 01 Nis 2016 03:58

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen hakanharbeli »

Benim de en çok dert yandığım konulardan birisi umarım bir bilen abimiz çıkar bizi aydınlatır
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen mkysoft »

:ara thread
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen adelphiforumz »

dosyayı bir thread'e parametre olarak gönder
thread işini bitirdiğinde geriye değer döndür ve işlemini tamamla.
ben genelde butarz uzun süren işlemlerde gif animate kullanıyorum progres bar biraz sorunlu oluyor
çünkü için nezaman biteceği belli olmuyor.
eğer çok acele değil ise gün içinde uygun bir zamandada örnek yapmaya çalışırım
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen ikra »

kıdemsiz üye
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

Basit bir thread örneği buldum. Aynen dediğiniz gibi programdaki donma olayını bitiriyor.
Güzel bir olaymış bu thread. :wink:

Thread konusunda bilgili arkadaşlar aşağıdaki örneği inceleyip bir eksiklik varsa söyleyebilir mi?

Kod: Tümünü seç

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Gauges;
type
  TForm1 = class(TForm)
    Gauge1: TGauge;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;

type
 TAntifreeze = class(TThread)
 protected
 procedure Execute;override;
end;

implementation

{$R *.dfm}

procedure TAntifreeze.Execute;
begin
Form1.Gauge1.Progress := 0;
 repeat
 Form1.Gauge1.Progress :=Form1.Gauge1.Progress+1;
 Sleep(1000);
 until Form1.Gauge1.Progress = Form1.Gauge1.MaxValue;
end;

procedure TForm1.Button1Click(Sender: TObject);          //aynı işi thread siz yaparsam program donuyor
var
threadantifreeze:TAntifreeze;
begin
 threadantifreeze := TAntifreeze.Create(true);
 threadantifreeze.FreeOnTerminate := true;
 threadantifreeze.Resume;
end;
end.
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen kimimben »

Form ve diğer görsel bileşenlere thread içersinden erişirken Synchronize methodu kullanılmalı.
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

üstteki kodda synchronize komutunu nereye yerleştirmem gerekiyor?
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen kimimben »

Execute methodu içersine.
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

birkaç deneme yaptım ama kod hata verdi.
Tam olarak nasıl kullanmam lazım yukarıdaki kodda yazabilirseniz sevinirim.
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen kimimben »

underwater yazdı:birkaç deneme yaptım ama kod hata verdi.
Yapılan denemeleri ve alınan hata mesajını paylaşmamak, "yazılımcının derman bulunamayan hallerinden" bir tanesi.
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

yukarıdaki şekliyle thread kullanımını kendi projemde uyguladım.
İşlemi yapaken donma olmuyor artık.
Ancak işlem bitince access violation hatası alıyorum.
Ardından da geçersiz pencere işleci hatası geliyor.

Sanırım yukarıdaki kodda bir eksiklik var. (synchronize komutunu kullanamadım) :wink:
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen kimimben »

Yazdığınız kodu paylaşabilir misiniz ?
viewtopic.php?t=24997
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

Tabiki. Kod şöyle:

Kod: Tümünü seç


type
 TAntifreeze = class(TThread)
 protected
 procedure Execute;override;
end;


implementation

{$R *.dfm}
uses DM,Ana;


 procedure TFormYukle.CompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  InpBytes, OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, inpStream.Size);
    inpStream.Position := 0;
    InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
    CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
    outStream.Write(OutBuf^, OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;


procedure TAntifreeze.Execute;
 var
 X:TMemoryStream;
 Z:TMemoryStream;
begin

  if Y=True then
  begin
   if
  (FormYukle.cxTextEdit1.Text=NullAsStringValue) or
  (FormYukle.cxTextEdit2.Text=NullAsStringValue) or
  (FormYukle.cxTextEdit3.Text=NullAsStringValue) or
  (FormYukle.cxTextEdit4.Text=NullAsStringValue) or
  (FormYukle.cxTextEdit5.Text=NullAsStringValue) or
  (FormYukle.cxCurrencyEdit3.Text=NullAsStringValue) then
  begin
  MessageBox(0,'Lütfen mavi alanları doldurunuz !   ', '', MB_OK or MB_ICONWARNING or MB_DEFBUTTON1 or MB_TASKMODAL);
  exit;
  end;
  FormYukle.Panel2.Visible:=True;
  FormYukle.Panel2.Refresh;
  X:=TMemoryStream.Create;
  X.LoadFromFile(Yol);
  Z:= TMemoryStream.Create;
  FormYukle.CompressStream(X,Z);

  FormYukle.ADOQInsert.Parameters[0].Value:=FormYukle.cxTextEdit1.Text;                            
  FormYukle.ADOQInsert.Parameters[1].Value:=FormYukle.cxTextEdit2.Text;                           
  FormYukle.ADOQInsert.Parameters[2].Value:=FormYukle.cxCurrencyEdit2.Value;                       
  FormYukle.ADOQInsert.Parameters[3].Value:=FormYukle.cxCurrencyEdit1.Value;                       
  FormYukle.ADOQInsert.Parameters[4].Value:=FormYukle.cxCurrencyEdit3.Value;                       
  FormYukle.ADOQInsert.Parameters[5].LoadFromStream(Z,ftBlob);                          
  FormYukle.ADOQInsert.Parameters[6].Value:=FormYukle.cxTextEdit3.Text;                           
  FormYukle.ADOQInsert.Parameters[7].Value:=FormYukle.cxTextEdit4.Text;                           
  FormYukle.ADOQInsert.Parameters[8].Value:=FormYukle.cxTextEdit5.Text;                      
  FormYukle.ADOQInsert.Parameters[9].Value:=strtoint(FormANA.Edit2.Text);               
  FormYukle.ADOQInsert.Parameters[10].Value:=strtoint(FormANA.Edit1.Text);               
  FormYukle.ADOQInsert.Parameters[11].Value:=GetEnvironmentVariable('COMPUTERNAME');   
  FormYukle.ADOQInsert.ExecSQL;
  FormYukle.Panel2.Visible:=False;
  end;

  if Y=False then
  begin
  if
  (FormYukle.cxTextEdit2.Text=NullAsStringValue) or
  (FormYukle.cxCurrencyEdit3.Text=NullAsStringValue) then
  begin
  MessageBox(0,'Lütfen mavi alanları doldurunuz !   ', '', MB_OK or MB_ICONWARNING or MB_DEFBUTTON1 or MB_TASKMODAL);
  exit;
  end;

  FormYukle.ADOQUpdate.Parameters[0].Value:=FormYukle.cxTextEdit2.Text;                           
  FormYukle.ADOQUpdate.Parameters[1].Value:=FormYukle.cxCurrencyEdit2.Value;                      
  FormYukle.ADOQUpdate.Parameters[2].Value:=FormYukle.cxCurrencyEdit1.Value;                       
  FormYukle.ADOQUpdate.Parameters[3].Value:=FormYukle.cxCurrencyEdit3.Value;                 
  FormYukle.ADOQUpdate.Parameters[4].Value:=FormYukle.cxTextEdit3.Text;                           
  FormYukle.ADOQUpdate.Parameters[5].Value:=FormYukle.cxTextEdit4.Text;                         
  FormYukle.ADOQUpdate.Parameters[6].Value:=FormYukle.cxTextEdit5.Text;                          
  FormYukle.ADOQUpdate.Parameters[7].Value:=strtoint(FormANA.Edit1.Text);                
  FormYukle.ADOQUpdate.Parameters[8].Value:=Now;                                        
  FormYukle.ADOQUpdate.Parameters[9].Value:=GetEnvironmentVariable('COMPUTERNAME');      
  FormYukle.ADOQUpdate.Parameters[10].Value:=FormYukle.ADOQGridDokumanID.Value;                
  FormYukle.ADOQUpdate.ExecSQL;
  end;

  FormYukle.ADOQGrid.close;
  FormYukle.ADOQGrid.Parameters[0].Value:=Ana.FormANA.Edit1.Text;
  FormYukle.ADOQGrid.open;
end;

procedure TFormYukle.ButtonKaydetClick(Sender: TObject);
 var
threadantifreeze:TAntifreeze;
begin
 threadantifreeze := TAntifreeze.Create(true);
 threadantifreeze.FreeOnTerminate := true;
 threadantifreeze.Resume;
end;
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Uzak SQL server a kayıt sırasında program tepki vermemesi hk.

Mesaj gönderen underwater »

Yukarıdaki örnek thread uygulamasını kendi koduma uyarladım.
Thread kullanmadan önce donma problemi haricinde kod çalışıyordu.

Normalde Kaydet butonuna bağlı kodları
TAntifreeze.Execute prosedürünün içine aldım örnekte olduğu gibi.
Cevapla