SORU
5 AĞUSTOS 2010, PERŞEMBE


Nasıl Çeşitli Yolları Arasında Delphi iş Parçacığı yapmak için seçerim?

Son olarak Delphi 2009 programı parçacığı bir çeşit uygulamak gerekiyor gibi görünüyor. Eğer bunu yapmak için tek bir yolu olsaydı orada devam ederdim. Ama birkaç olasılık görüyorum.

Kimse bunlar arasındaki fark ne ve başka bir yere seçerdim neden açıklayabilir.

  1. Delphi TThread sınıfı

  2. Andreas Hausladen AsyncCalls

  3. Primoz Gabrijelcic (gabr) OmniThreadLibrary

  4. ... başka var mı?


Düzenleme:

Sadece Blaise Pascal Magazine Mart 2010 (10) konu Gabr tarafından mükemmel bir makale başlıklı okudum "Dört Yol bir iş Parçacığı Oluşturmak için". Dergi için içerik kazancı abone olmanız mı, telif hakkı ile, bu konuda önemli burada sunamayacağı.

Özetle, Gabr kullanarak TThreads, doğrudan Windows API çağrıları, Andy'nin AsyncCalls ve kendi OmniThreadLibrary arasındaki farkı açıklar. Sonunda sonuçlandırmak istiyor:

"Klasik Delphi (TThread) ama yine de iyi seçenek haberdar olmak için daha başka bir şey seçmek zorundasınız demiyorum"

Mghie cevabı çok kapsamlı ve OmniThreadLibrary tercih edilebilir önerir. Ama yine de ben (ya da kimse) uygulaması için kendi iş parçacığı yöntemi seçmeliyim hakkında herkesin fikirlerini merak ediyorum.

Ve listeye ekleyebilirsiniz:

. 4. Doğrudan Windows API çağrıları

. 5. Onun cevabı LachlanG önerdiği gibiMisha Charrett's CSI Distributed Application Framework .


Sonuç:

Muhtemelen OmniThreadLibrary ile gidiyorum. Gabr çalışmaları gibi. Profiler onun GPProfile yıllar önce kullandığım ve şu anda aslında OTL parçası olan onun GPStringHash kullanıyorum.

Benim tek endişem, Embarcadero Delphi içine işlevselliği ekler bir kez 64-bit veya Unix/Mac işleme ile çalışmak için yükseltme olabilir.

CEVAP
6 AĞUSTOS 2010, Cuma


Eğer çoklu iş parçacığı ile deneyimli değilse muhtemelen ama yerel iş parçacığı üzerinde ince bir tabaka olarak TThread ile başlamak gerekir. Düşünüyorum da, biraz kaba işlemeleri de var; var evrimleşmemiş bir sürü beri giriş ile Delphi 2, çoğunlukla değişiklikler için izin vermek için Linux uyumluluğu ve Kylix zaman dilimi ve doğru daha belirgin kusurları (gibi sabitleme kırık MREW sınıf, ve son olarak küçümseyen Suspend() Resume() en son sürümü Delphi).

Basit iplik sarıcı bir sınıf kullanarak temelde aynı zamanda geliştirici çok çok düşük bir düzeyde odaklanmak neden olur. İçin uygun olarak birden fazla CPU çekirdeği odaklı görevleri yerine konuları daha iyi, çünkü bölümleme iş parçacığı değil uyum için değişen şartları ve ortamları bağlı olarak donanım ve diğer yazılım çalışan paralel optimum parçacığı sayısı değişebilir büyük ölçüde, hatta farklı zamanlarda aynı sistem. İş sadece parçalar geçmesi, ve onları otomatik olarak mevcut en iyi yaralanmak programları olan bir kitaplığı bu konuda çok yardımcı olur.

AsyncCalls bir uygulamaya konuları tanıtmak için iyi bir ilk adımdır. Eğer çeşitli alanlarda programınızı bir sayıda zaman alıcı adımları yapılması gerekenler bu bağımsız birbirimize, sonra sadece çalıştırmak onları uyumsuz olarak geçen her onlara AsyncCalls. Tek zaman alan böyle bir eylemi bile zaman zaman uyumsuz olarak çalıştırmak ve sadece BASKI iplik ilerleme UI, isteğe bağlı olarak eylemi iptal etmek için izin verebilirsiniz.

AsyncCalls olduğunu IMO pek iyi değil arka plan işçi kalmak sırasında tüm program çalışma zamanı, ve olabilir imkansız kullanırken bazı eşyalar programınız var parçacığı benzeşme (veritabanı bağlantıları veya OLE nesneleri Mayıs gereksinimi olan tüm görüşmeleri aynı iş parçacığı).

Sen de farkında olmak gerekir ne bu zaman uyumsuz eylemler olmasıdırdeğil"ateşle ve unut" tür. AsyncCall() Her işlevde eğer engelleme önlemek istiyorsanız, bir başvuru tutmak için gereken IAsyncCall bir arabirim işaretçisi verir. Eğer bir referans yok eğer doğru değilse, o zaman hakem saymaya ulaştığında arabirimi iş parçacığı arabirimi asenkron çağrı için beklemek bırakmadan neden olacak serbest olacak sıfır. Bu IAsyncCall oluşturulan yöntem çıkmadan zaman gizemli bir miktar sürebilir, hata ayıklama sırasında görebilirsiniz.

OTL bence üç seçenek arasında en çok yönlü ve bir saniye bile düşünmeden kullanırdım. Her şeyi TThread ve AsyncCalls yapabilir, artı çok daha fazlasını da yapabilir. Bir ses tasarımı, üst düzey, hem yapmak yaşam için Kullanıcı kolay, ve izin bir bağlantı noktası için bir Unixy sistemi (süre tutarak en arayüzü sağlam) bak en azından mümkün değilse kolay. Son aylarda da paralel çalışma için üst düzey bazı yapılar almaya başladı, şiddetle tavsiye.

OTL başlamak için önemli olan birkaç düzine örnekleri de vardır. AsyncCalls bir şey yok ama yorumlarda bir kaç satır var, ama sınırlı işlevsellik (bir tek şey gibi görünüyor, ama bunu iyi yapıyor) nedeniyle anlamak için yeterince kolaydır. TThread gerçekten 14 yıldır hiç değişmemiş olan tek bir örnek, ve çoğunlukla şeyler yapmak değil, nasıl bir örnektir.

Hangisini seçerseniz seçin, hiçbir kütüphane iş parçacığı oluşturma hakkında temel bilgileri kavrama ihtiyacını ortadan kaldırır. Bu iyi bir kitap okumak zorunda başarılı bir kodlama için bir önkoşuldur. Örneğin kilitleme uygun hepsiyle bir gereklilik.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • EmbarkToHeaven

    EmbarkToHeav

    3 EYLÜL 2007
  • Krumme1996

    Krumme1996

    21 EYLÜL 2009