TThread ile bir kaç soru

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fox
Üye
Mesajlar: 78
Kayıt: 24 Nis 2006 08:28

TThread ile bir kaç soru

Mesaj gönderen fox »

İyi günler Ben D7 di VCL kullanıyorum Program çalışırken kilitlenme olmasın diye TThread sınıfından nesne oluşturup programı çalıştırmak istiyorum.

Benim programın internet sayfalarında gezinip onlardan bilgi çekmeye yarıyor ve içinde bir tane idHttp ve stringGrid var. Ama malesef programım kilitleniyor. Kapata basınca kapanmıyor sağa çekince 1-2 sn sonra gidiyor. bir button basılı durumda kalıyor.

Birinci sorum ben bir thread oluşturdum diyelim

Kod: Tümünü seç

uses
  SysUtils, Classes; 
  
type
  TBirDonguKanali = class(TThread) 
  protected
    procedure start; 
    procedure Execute; override; 
  end; 
  
implementation
  
{ TBirDonguKanali }
  
uses
  Unit1; 
  
procedure TBirDonguKanali.Execute; 
var
  i: Integer; 
begin
  for i := 0 to 99 do
  begin
    Sleep(100); 
    Synchronize(start); 
  end; 
end; 
  
procedure TBirDonguKanali.start; 
begin
  Burada kullanıcağım/////////////; 
end;
yukarıda belirttiğim içirisinde kullanıcağım yer illa ki TBirDonguKanali sınıfındamı olmalı. Yani ben unit bir de tanımlamış olduğum bir X fonksiyonu burdan çağırsam o fonksiyon TBirDonguKanali threadinde mi çalışmaya devam ediyor. Yoksa ana yerinde mi. Yani programın kilitlenmesine bumu neden olur?

2. Sorum ben Synchronize start ederken kullandım. StringGrid de veri yazarkendemi kullanmalıyım. Veya Synchronize bir kere ana fonksiyonda kullanmak yeterlimidir.

Teşekkür Ederim
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: TThread ile bir kaç soru

Mesaj gönderen sabanakman »

- VCL bileşenlerinin neredeyse tamamının kanal uyumluluğu malesef yoktur. Bu yüzden kodlarınızın içeriğinde "VCL bileşenlerini kullanıyor musunuz? " asıl soru olacaktır. Zira diğer modülden çağrılan fonksiyon ve prosedürler VCL görsel bileşenleri kullanılmadığı zaman çalıştırılması sakınca doğurmayacaktır.

- Bu noktada Synchronize prosedürü öne çıkacaktır. Zira programın çalıştığı ana kanaldaki boşluğu bekler ve ilk boşluk anında parametre aldığı kodları çalıştırır. Yani sonuçta bir kanal değil, ana program normal olarak çalışıyormuş gibi olur ki bu durumda VCL görsel bileşenleri kullanılabilir.

-Execute metodu içerisindeki kanal döngüleri muhakkak program kapanırken veya dışarıdan müdahelelerle kapanabilir olmalı. Mesela kurulan döngü yapısı

Kod: Tümünü seç

repeat
....
....
until Terminated;
içinde olmalı veya

Kod: Tümünü seç

if Terminated then Exit;
gibi bir kodla Execute metodu döngüsü sonlandırılmalıdır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: TThread ile bir kaç soru

Mesaj gönderen Battosai »

Thread ile bişeyler yapmadan önce aşağıdaki adrestedeki threading1 ve 2 makalelerini okumanda fayda var....Ben thread mevzusunu daha detaylı ve anlaşılır anlatan başka bir makale daha görmedim türkçe olarak tabi...
http://www.tugrulhelvaci.com/
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: TThread ile bir kaç soru

Mesaj gönderen comfort »

Sencronize komutunu çok kullanacaksan thread kullanma daha iyi çünkü sencronize komutu işleri ana kanala yükler ve formun kilitlenir.
fox
Üye
Mesajlar: 78
Kayıt: 24 Nis 2006 08:28

Re: TThread ile bir kaç soru

Mesaj gönderen fox »

Kullanığım Suiskin componenti (tüm bileşenlere görsellik veriyor). ana unitten fonksiyon çağırmanın bir mahsuru varmı? Onun cevabınıda alırsam hepsini bu threade gömeceğim.
fox
Üye
Mesajlar: 78
Kayıt: 24 Nis 2006 08:28

InterlockedCompareExchange

Mesaj gönderen fox »

InterlockedCompareExchange nasıl kullanıcağız tam manasıyla kavrayamadım
tugrulhelvaci.com da şöyle bir kod var
if InterlockedCompareExchange(Pointer(iValue), Pointer(iValue), Pointer(0)) = Pointer(10) then InterlockedExchange(iValue, 50);

Pointer olan yerleri nasıl işleyeceğiz benim yapmak istediğim kod

var
a,b,uzunluk:integer;
begin
if a>=uzunluk then
begin
a:=1;
inc(b);
end;

inc yerine InterlockedIncrement(b);
a:=1 yerine InterlockedExchange(a, 1);

ama if yapısını kuramadım
Cevapla