Query'yi Threadingle yaptım ama yine ekran donuyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Query'yi Threadingle yaptım ama yine ekran donuyor

Mesaj gönderen a.mikayil »

Arkadaşlar, ben yaklaşık 1 haftadır Delpi'de threading öğreniyorum. Daha önceleri VCL threade yaptırdığım veri yükleme içlemini şimdi bir worker Thread objeye yaptırıyorum ama arada hiç bir fark yok. Yani ADOQuery verileri yüklerken yine de ekran donuyor ve ben hiç bir şey yapamıyorum.Biliyorum uzun ama affınıza sığınarak kodu yazmak istiyorum.Öncelikle Thread objem:

Kod: Tümünü seç

unit uRPSQLThread;

interface

uses
  Classes, ActiveX, SysUtils, Dialogs, ADODB, Forms;

type
  TRPSQLThread = class(TThread)
  private
    FDataSet: TADOQuery;
    FSearchParam: string;
    FRPFrom: TForm;
    FCursor: integer;
  protected
    procedure Execute; override;
    procedure LoadSQL;
  public
    property ThrDataSet: TADOQuery read FDataSet write FDataSet;
    property SearchStr: string read FSearchParam write FSearchParam;
    property RPForm: TForm read FRPFrom write FRPFrom;
    property RPCursor: integer read FCursor write FCursor;
  end;

implementation

{ TRPSQLThread }

procedure TRPSQLThread.Execute;
begin
  Synchronize(LoadSQL);
end;

procedure TRPSQLThread.LoadSQL;
begin
  with ThrDataSet do
  begin // with AQ_GRID_RAB zapros
    RPForm.Cursor := RPCursor;
    SQL.Clear;
    Active := False;
    SQL.Append('SELECT  DR.DRCODE, DR.DRNAME, DRS.DRSPECFULLNAME, DRL.DRLEVEL, HS.HOSPFULLNAME,PT.PAIDTYPE,');

    SQL.Append(' RG.REGIONNAME, ROUND(SUM(ISNULL(TOTALPRESC.DRUGPRICESUM, 0)),2) AS TOTALPRESC,ROUND(DR.DEBT,2) AS DEBT'
      );
    SQL.Append(' FROM LAZS_HOSPITALS AS HS INNER JOIN');
    SQL.Append(' LAZS_REGIONS AS RG ON HS.REGIONID = RG.REGIONID INNER JOIN');
    SQL.Append(' LAZS_DOCTORS AS DR ON HS.HOSPID = DR.HOSPID INNER JOIN');
    SQL.Append(' LAZS_PAIDTYPE AS PT ON PT.PAIDTYPEID=DR.PAIDTYPEID INNER JOIN');
    SQL.Append(' LAZS_DRSPECS AS DRS ON DR.DRSPECID = DRS.DRSPECID INNER JOIN');
    SQL.Append(' LAZS_DRLEVELS AS DRL ON DR.DRLEVELID = DRL.DRLEVELID LEFT OUTER JOIN');
    SQL.Append(' (SELECT  INVD.DRUGPRICESUM, INV.DRID');
    SQL.Append(' FROM AZS_INVOICE AS INV INNER JOIN');
    SQL.Append(' AZS_INVOICEDET AS INVD ON INV.INVID = INVD.INVID) AS TOTALPRESC ON DR.DRID = TOTALPRESC.DRID     ');
    if SearchStr <> '' then
      SQL.Append('WHERE DR.DRSTAT=1 ' + SearchStr);
    SQL.Append(
      ' GROUP BY DR.DRCODE, DR.DRNAME, DRS.DRSPECFULLNAME, DRL.DRLEVEL, HS.HOSPFULLNAME, RG.REGIONNAME ,DR.DEBT,PT.PAIDTYPE');
    Active := True;
  end;

end;

end.
buysa main formda Thread'i kullandığım kod:

Kod: Tümünü seç

var
 i,aciq:integer;
  SQLRpThrd: TRPSQLThread;
begin
............
...........//Bu kısımda arama kriterleri olan bir form ShowModal komutuyla açılıyor.Daha sonra eğer o formun Modal Result'ı 6 ise raporun görüntüleneceği 
.......... diğer form açılıyor. 
 
       try
          SQLRpThrd := TRPSQLThread.Create(True);
          SQLRpThrd.FreeOnTerminate := True;
          with SQLRpThrd do
          begin
            ThrDataSet:=QRp;
            SearchStr:=fSearchParam.EditFilter.Text;
            RPForm:=Report[aciq];
            RPCursor:=crBlueBusy;
            Resume;
          end;
..........................
.........................
end;
Nerede yanlış yaptığımı söyleye bilir misiniz?
İstikrar sürsün, Türkiye'm büyüsün inşallah.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Query'yi Threadingle yaptım ama yine ekran donuyor

Mesaj gönderen sabanakman »

Programı düz olarak kodlamakla, işlem (thread) içinde Synchronize metodunu çağırmak arasında neredeyse hiç fark bulunmaz. Synchronize metodu da zaten ana işlemdeki boşluğu yakaladığı anda, sanki ana işlem parçasının kodlarıymış gibi çalıştırılan bir metottur.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla