Threading bir türlü çalışmıyor

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

Threading bir türlü çalışmıyor

Mesaj gönderen a.mikayil »

Arakadaşlar, ben yaklaşık 2 haftadır Query'yi çalıştırırken ekranın donmaması, uygulamada başka bir şey yapa bilmem için threadingi kullanmayla uğraşıyorum. Ama gerçekten de nedir bu threadingden çektiğim. Tuğrul beyin blogundaki Mutex örneği gayet güzel çalışıyor. Ama gerçek bir uygulamamda aynı şeyleri yapmama rağmen bir şey fark etmiyor. Hatta daha önce Query bittiğinde bir buton basılıyordu. Şimdi o buton da basılmıyor. İsterseniz ben becerebildiğim kadar kısa bir şekilde ne yaptığımı anlatmaya çalışayım
Şimdi, bir Menüye tıkladığımda önce ShowModal komutuyla bir form (fSearchParam) açılıyor. .O formda arama kriterlerimi seçiyorum.Daha sonra fSerachParam'ın ModalResult'ı mrYes olursa o zaman veritipi daha önce oluşturmuş olduğum TfRPView (bu bir form) olan dizinin 0. elemanı açılıyor. Buraya kadarını Main Threade yaptırıyorum. O formda QRp isimli bir ADOQuery nesnesi var.

Kod: Tümünü seç

with QRP do
begin
 Active:=False;
 SQl.Clear;
 SQL.Append('...........')
 try
 Active:=True;
end;
İşte şu yukarıdaki kısmını bir Threadle çalıştırmak istiyorum. Thread'se şöyle

Kod: Tümünü seç

constructor TRPSQLThread.Create(const ThrDataSet: TADOQuery);
begin
  inherited Create(true);
  FreeOnTerminate := true;

  FDataSet := ThrDataSet;

  Resume;
end;

procedure TRPSQLThread.Execute;
begin
  inherited;
  WaitForSingleObject(MutexHandle, INFINITE);

 with FDataSet do
begin
 Active:=False;
 SQl.Clear;
 SQL.Append('...........')
 try
 Active:=True;

  ReleaseMutex(MutexHandle);
end
burada başka yapmam gereken nedir?
İ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: Threading bir türlü çalışmıyor

Mesaj gönderen sabanakman »

-Hangi veritabanı?
-Sorgudan kaç kayıt geliyor?
-Sistem donanım özellikleri nedir?

Sorulardan farklı bir anlam çımasın, eğer imkan olursa benzeri bir ortamda uygulama yaparak cevap vermek daha sağlıklı olacaktır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: Threading bir türlü çalışmıyor

Mesaj gönderen a.mikayil »

İlginiz ve yardım etmek isteğinize göre teşekkür ederim.

Veri tabanı-MS SQL2005
Sorgudan gelen kayıt satısı-614 ama artacaktır
Donanım-RAM 1GB, Intel Core 2 Duo T5470 @1.60 Ghz

Allah razı olsun.
İstikrar sürsün, Türkiye'm büyüsün inşallah.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Threading bir türlü çalışmıyor

Mesaj gönderen thelvaci »

Neden WaitForSingleObject ile bir mutex'i bekliyorsunuz. Uygulamanızda o anda çalışacak olan sql kodunu çalıştırabilecek bir başka exe'nin örneği mi var ? Ayrıca thread içinde kullanacağınız connection'ı thread içinde oluşturmalısınız ve thread'i mümkün mertebe izole etmelisiniz.(CoInitialize, CoUnInitialize unutmamalısınız.) Burada kastettiğim şey, bir thread içinden dış dünya ile iletişim kurarken dikkat etmelisiniz. Yani form üzerindeki bir nesneye erişim sağlamanızı önermiyorum.(İlla erişecekseniz Synchronize altında yapmalısınız. Ama tüm kod bloğunu Synchronize ile çalıştırmanız da threadingi anlamsızlaştıracaktır.) Eğer mümkün ise o nesneyi de thread içinde create etmelisiniz. Kısacası; bir thread mümkün mertebe main thread'den izole çalışmalıdır.!
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: Threading bir türlü çalışmıyor

Mesaj gönderen a.mikayil »

Tamam Tuğrul bey. (İyi ki, de geldiniz) Ama ben bir şeyi merak ediyorum. Daha önce Query'yi main thread çalıştırıyordu. Ama şimdi Thread bu işi yapıyor.Eğer Threading yanlışsa (ki, siz öyle diyorsanız elbette yanlıştır) neden bir hata vemiyor ve yine sorguyu çalıştırıp verileri ekrana çıkarıyor? Şimdi bir kere ben bu işi Main Threade yaptırmıyorum, e Worker Thread de düzgün kurulmamış,peki o zaman neden en azından önceki gibi çalışıyor.Tamamıyla çalışmaması gerekmez miydi?
Bi de bi şey sorayım: Query'nin sonuçlarını listeleyecek DBGrid fRPView isimli başka bir mdiChıld formda bulunmaktadır. yani ben query'yi çalıştırıyor, daha sonraysa formu açıyorum. Acaba ben Grid, hatta formun kendisini bile Thread'in içerisinde mi oluşturmalıyım?
(Şimdiye kadar en iyi anladığım konular uzun zaman böylesine beni uğraştıran ve 'Her halde ben bu işi hiç bir zaman yapamayacağım' dedirten konular olmuştur. :) )
İstikrar sürsün, Türkiye'm büyüsün inşallah.
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Re: Threading bir türlü çalışmıyor

Mesaj gönderen meron06 »

neden jedi jvcl nin thread nesnesini kullanmıyorsunuz.çok güzel bi bileşen ben hep onu kullanırım kullanımıda çok kolay
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: Threading bir türlü çalışmıyor

Mesaj gönderen akdatilla »

Merhaba Arkadaşlar
Benimde kısa bir zaman once thread kullanarak query çalıştırmam gerekmişti. Biraz araştırıp bazı denemeler yaptım bazı sorunlarla karşılaştım..
en son bir siteden aldığım basit bir ornek üzerinde yaptığım birkaç düzeltme/değişiklik ile sorunu çözebildim.
Aşağıdaki kodlar sizinde işinizi gorecektir sanırım

Kod: Tümünü seç

interface
uses....

type
  TQThread = class(TThread)
  private
    FQuery: TADOQuery;
    FDataSource:TDataSource;
  protected
    procedure Execute; override;
    procedure FOnFinishProc;
  public
    FOnFinish:TNotifyEvent;
    ForExecute:Boolean;
    IQTIsSonu:integer;
    constructor Create(Query: TADOQuery;DSr:TDataSource);
    procedure Start;
  end;
  TMainF = class(TForm)
....
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function ThreadQExec(Qt:TADOQuery;tsql:String):Boolean;
    function ThreadQOpen(Qt:TADOQuery;tsql:String):Boolean;

    procedure SipOnIzleme(sipno:String);
  end;

var
  MainF: TMainF;

implementation


constructor TQThread.Create(Query: TADOQuery;DSr:TDataSource);
begin
  inherited Create(True);     // Create thread in a suspendend state so we can prepare vars
  IQTIsSonu:=0;
  ForExecute:=False;
  FQuery := Query;            //Set up local query var to be executed.
  FDataSource:=DSr;
  FreeOnTerminate := True;    //Free thread when finished executing
end;

procedure TQThread.Execute;
begin
    FQuery.Close;
    try
       if ForExecute then
       FQuery.ExecSQL
       else
       FQuery.Open;                    //Perform the query
    except
    end;
    if Assigned(FDataSource) then FDataSource.DataSet:=FQuery;
    Synchronize(FOnFinishProc);
    
end;
procedure TQThread.FOnFinishProc;
Var
   Chk:^Boolean;
begin
     if IQTIsSonu<>0 then
     begin
          chk:=Pointer(IQTIsSonu);
          chk^:=True;
     end;
     if Assigned(FOnFinish) then FOnFinish(nil);
end;

procedure TQThread.Start;
begin
     Resume;
end;

function TMainF.ThreadQExec(Qt: TADOQuery; tsql: String): Boolean;
var
   QTIsSonu,ti:Boolean;
begin
     Result:=False;
     if not Assigned(Qt.Connection) then exit;
     Qt.Close;
     Qt.SQL.Text:=tsql;
     Try
        QTIsSonu:=False;
        with TQThread.Create(Qt,nil) do
        begin
             ForExecute:=True;
             IQTIsSonu:=integer(@QTIsSonu);
             FOnFinish:=QThreadSonu;
             Start;
        end;
        while not QTIsSonu do
        begin   
             Application.ProcessMessages;
             sleep(5);   
             if Application.Terminated then exit;   
             if ASCProgressSwc then exit;   

        end;   
        ti:=true;   
     Except   
        ti:=False;   
     End;   
     Result:=ti;   

end;

function TMainF.ThreadQOpen(Qt: TADOQuery; tsql: String): Boolean;
var   
   QTIsSonu,ti:Boolean;

begin
     Result:=False;
     if not Assigned(Qt.Connection) then exit;
     Qt.Close;
     Qt.SQL.Text:=tsql;
     Try
        QTIsSonu:=False;
        with TQThread.Create(Qt,nil) do
        begin
             ForExecute:=False;
             IQTIsSonu:=integer(@QTIsSonu);
             FOnFinish:=QThreadSonu;
             Start;
        end;
        while not QTIsSonu do
        begin
             Application.ProcessMessages;
             sleep(5);
             if Application.Terminated then exit;
             if ASCProgressSwc then exit;

        end;
        if not Qt.Active then exit;
        ti:=Qt.RecordCount>0;
     Except
        ti:=False;
     End;
     Result:=ti;

end;

procedure TMainF.FormClick(Sender: TObject);
begin
{AdoConnection bağlantılarının yapıldığını farzediyorum}
     if DM.ThreadQOpen(q2,'select distinct sirkod,bolkod from bolge where (aktif<>1 or aktif is null) and sirkod in (1,2) order by 1,2') then
     ///yukarıdaki komutun çalışması esnasında ana form uzerinde timer vb işlevler çalışmaya devam etmektedir. Ancak ana program duracak ve aşağıdaki komutlar querynin sonlanmasını bekleyecektir.
     begin
          q2.First;
          while not q2.Eof do
          begin
                  .....
                  q2.Next;
          end;
    end;
end;


Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: Threading bir türlü çalışmıyor

Mesaj gönderen a.mikayil »

Emeğiniz için teşekkür ederim
İstikrar sürsün, Türkiye'm büyüsün inşallah.
Cevapla