Thread kullanimi icin yardim.

Başlatan bunalmis, 29 Ocak 2010, 11:37:54

z

Uzun zamandir ugrastigim projemin windows programimi nihayet bitirdim ve programi V1 versiyonu olarak cikartiyorum.

Urunu piyasaya cikartacagim bu gunlerde hemen V2 calismalarina baslamam gerekiyor. V2 ile hem buglar giderilecek hem de programin mantigi bastan sona degistirilecek. (Haliyle yeni buglar uretilecek)

Daha once uzerinde bol bol tartistigimiz thread calismasini V2 versiyonunda gerceklestirecegim.

Ancak thread konusunda bu ilk calismam  olacak ve daha ilk bastan iskeleti yanlis kurmak istemiyorum.

Programin isleyisi su sekilde;

Program bufferdan okudugu verileri paketler haline getiriyor ve usb cihaza  yolluyor. Her paket icin usb cihazdan dogru checksum bilgisi bekliyor.

Eger dogru checksum gelirse bir sonraki paketi yolluyor. Gelmedi ise son paketi tekrarliyor.

Programin asil yaptigi islem bu.

Ekranda birde BEKLE ve VAZGEC adinda iki buton var. Bu iki buton, adlarindan anlasilacagi uzere ya paket gonderimini tamamen durduruyor ya da DEVAM et butonuna basilincaya kadar paket gonderme islemini askiya aliyor.

V1 versiyonunda bu islemler Application.process.messages ile yapiliyordu.

Simdi bunu thread ile yapmak istiyorum.

Bunun icin nasil bir yapi kurmaliyim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

@wsxwsx

Senin thread konusunda verdigin bir ornek kod vardi onu inceledim. Onu temel alip devam edebilirim fakat ilk baslangic onemli oldugu icin ozellikle senin cevaplamani istiyorum.

USB Rx-Tx icin bir thread olusturayim diye dusunuyorum.
Birde paketleme isleri ile ugrasan thread.

Ancak verdigin ornekte sleep ile diger thread lere zaman ayirmaktan bahsetmissin.

Sleep kullanmak zorundamiyim.

Rx-Tx threadi, surekli dongude kalsin, gelen bilgileri alsin hata yada acil durumlari varsa geregini yapsin, paket isi ile ugrasan threadle global degiskenler vasitasiyla haberlessin diyorum.

Ana formda dahil olmak uzere birden fazla thread calistirildiginda thread fonksiyonlarinin isletilmesi icin zaman paylasimi nasil oluyor?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

Zaman paylaşımının nasıl olduğunu tam bilmiyorum. ancak bir thread içine sleep yazılmazsa diğer threadlerin çalışmadığını farkettim.
tx rx işleri için ben bir kaç adet thread kullanıyorum.  öyle ki mesela veriyi alıp okuyan thrrad içinde sleep(200)  yazmasına rağmen gelen bilgilerde hiç kesilme olmuyor. BUnun sebebini de şuna bağladım. thread içinde başka nesneler oluşturuyorum. bu nesneler usbden gelen bilgileri okuyabilmek için muhtemelen kendi threadlerini açıyor. ve kendi olaylarını tetikliyor. bu olaylar benim thread içinde duruyor.  BU nesneler, benim yapmadığım başka komponentlere ait. ben sadece olaylar içine kod yazıyorum. sleep(200)   yazmam bu olayların tetiklenmesini hiç etkilemiyor. Çünkü her mili sn gelmesi gereken bilgiler var. onlar gelebiliyor iş aksamıyor.   eğer bilgiler birikmişse onları başka bir işleme tabi tutuyorum. thread içinde yazılı fonksiyonlar ona bakıyor. ..ms bekliyor.  birikmiş mi diye bakıyor.

Sizin çip neydi? uygun bir komponent demo ayarlayalım.  Beğenirseniz veya işinizi görürse belki satın alırsınız. KOrsanı da olabilir. Ben bu komponentleri satın aldım. ancak bunlardan başka komponentler elde ederek pazarlamayı , böylece maliyeti kurtarmayı düşünüyorum.

Daha önce FTDI çipleri ile ilgili uğraştım.  onlarla ilgili kod var. komponent gerekmiyor. ama ayrı thread gerekliydi. orada sleep yazamıyorduk.  (o tarihte thread işini becerememiş olabilirim)

ŞUan pic (HID olarak) kullanıyorum. aynı konforda çalışıyor gibi.

z

Komponent isine girmek istemem. Mevcut yazilimi thread tipine cevirsem yeterli.

FT232 kullaniyorum ve haberlesme ile ilgili hic sikintim yok.

Su anki mevcut yapida karsi taraftan cevap gelinceye kadar dongude kalip buffera veri gelip gelmedigini test ediyorum. Bu dongunun icinde bir yandan da surekli olarak Bekle, vazgec butonuna basilmismi diye kontrolum var.

Mecburen bunlari process.messages ile kontrol ediyorum.

Threadleri bekletme sansim varmi? Mesela usb ile hic isimin olmadigi fakat uzunca bir dosyayi okuyup bunun uzerinde syntax check yapmam gereken durumlar var. Threadlerin bu esnada calisiyor olmasi islemlerimin bitis suresini etkilermi?

Bir threadi istedigim zaman kapatip istedigim zaman baslatabilirmiyim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

th.suspend; threadi askıya alır
th.resume;  devam ettirir

Askıya alınan thread içindeki olaylar galiba tetiklenemiyordu.  fonksiyonlar da çalışmıordu. bu yüzden sleep yazarak döngü içinde bekletiyordum. fakat sen gerçekten çalışmasını istemezsen askıya alabilirsin.

z

Soyle bir sorun farkettim ve threadleri daha yetenekli diye dusunuyordum.

Sizin thread orneginde timer icinde th.sayac degerini labela aktaran satiri thread execute dongusu icine koydum.

Forma bir tane de buton ekledim.

Bu butona tiklandiginda butonclick procedurunu sonsuz donguye soktum. Hatta sorun gorunce icine sleep, olmadi application.precessmessages ekledim.

Program calisirken bu butona tikladigimda program bir sure calisiyor ve daha sonra saymayi durduruyor.

Halbuki ben thread execute rutininin diger olaylardan etkilenmeden calismaya devam edecegini dusunuyordum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

muhtemelen  yanlış birşey yapmışsınız. th.sayac degerini labela aktaran satiri thread execute  içine eklemeyin. BUnun yerine form, labele yazılacak değeri  kendisi okusun . timer ile okuyabilir. hazır yapılmışı bu:

http://www.speedyshare.com/files/20628859/dosyalar.rar

procedure TForm1.Button1Click(Sender: TObject);
var
  say: integer;
begin
  say := 0;
  while not application.Terminated do
  begin
    say := say + 1;
    application.ProcessMessages;
  end;

end;


. thread içine yazılabilecek şeyler genelde kendisi ile ilgili şeylerdir. eğer dışarıdan birşey yazarsanız ya da bir global  eğişkeni değiştireyim derseniz işler karışabilir. ki o örnekte öyleydi. ama pek sorun yoktu. Çünkü dışarıdaki değişkene başka bir etki yoktu.

örneğin 2 thread var 2 side global bir sayacı değiştirmeye çalışıyor. bunlar aynı değiişkene birlikte müdahale etmeye çalışırken hata çıkabilir.  eğer öyle bir durum varsa birbirlerini beklemesi gerekir

{
You need to create a global TCriticalSection and lock / unlock it when you access
shared resources with code as shown below.

Create a separate TCriticialSection instance for each resource that can be used
independently.
TCriticialSection is defined in unit SyncObjs.
}

uses
  SyncObjs;

// one lock for each independent resource
var
  myLock : TCriticalSection;

// early during application startup:
myLock := TCriticalSection.Create;

procedure TMyThread.Execute;
begin
  //... lock it
  myLock.Acquire;

  // use the shared resource

  // unlock it..
  myLock.Release;
end;

controller

Thread önceliği thread'in "Priority" özelliği ile ayarlanır, önceki konularda bu linki vermiştim;

http://msdn.microsoft.com/en-us/library/ms685100(VS.85).aspx
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

wsxwsx

önceliği istediğin gibi ayarla. fakat mantık hatası varsa, program çatlama yapar.

z

Thread mantıgıyla program olusturmam gereken bir projeye başladım.

Sorunum bu konuda hiç deneyimimin olmaması.

Konuyu kısaca özetleyeyim.

Programın Thread ile ilgili parçası sürekli bir döngü içinde FT232 ye gidecek ve ondan gelecek verilerle uğraşacak.
Formun herhangi bir proceduru ile Thread parçası aralarında sorunsuz veri aktarımı yapabilmeli.

Forumda daha önce thread konusunda örnekler verildi ancak veri aktarımında sıkıntılar çıkabileceğinden sözedildi.

Bu uygulama için basit bir kod örneğiniz varmı?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

orhanc

eğer kod kullanmak zor geliyorsa Delphi Jedi Project var. orada Component olarak kullanılan bir thread var. Timer misali kullanımı çok basit. Bir Göz atın isterseniz.
i'm doing nothing... Giddy Up  http://www.drorhan.com