2009-11-06 19 views
5

Arka plan iş parçacıklarına göre kesintili görevleri uygulamak istiyorum. TTask.Stop yöntemini uygulamanın en temiz yolu nedir? Arka plan iş parçacığını nasıl iptal edebilirim?Bir iş parçacığı iptal ettiniz mi?

İş parçacığı içeriğinde yürütülen kod, anonim bir yöntem kullanarak göreve iletilir ve çağrıları engelleyebilir, bu nedenle, Terminated bayrağının düzenli olarak kodun içinden kontrol edildiğine güvenemem.

Herhangi bir girdi için teşekkürler. bu konularda durumunda D2010 (TThread bazı şeyler değişmiş gibi görünüyor)

cevap

7

güvenle çalışan bir iş parçacığı iptal etmek yolu yoktur kullanma

. Bu, Windows programlarında Delphi'de yazılmış olsun ya da olmasın ve Delphi 2010 ya da daha önce kullanılıp kullanılmadığı için geçerlidir. Bunu çağırmak istiyorsanız bir işletim sistemi sınırlamasıdır, ancak aslında bir iş parçacığı sınırlamasıdır, bir iş parçacığı kilitlemeyi engellemeden ya da böyle bir şey sizin programınıza zarar verecek gibi olmadığından emin olun.

Yapabilecekleriniz kötülük olan TerminateThread() API işlevini çağırmaktır. Bu bağlantıdaki sorunlar ve uyarılar listesini okuyun ve hala aramak isteyip istemediğinize bakın. Görev kodundan işbirliği yapılmadan çalışan başka bir yol yoktur.

7

İşi ayrı bir işleme ayırın. Arka plan işiyle nasıl iletişim kurduğunuza bağlı olarak, bu muhtemelen temizlemeyi iptal etmenin en iyi yoludur. Örneğin, iletişim için paylaşılan belleği kullanmak iyi bir ide değildir; dosya veya boruları veya diğer ucun öldüğü zaman kırılmayan veya durmayan benzer bir mekanizma kullanın. Çapraz işlem senkronizasyonu için adlandırılmış muteks kullanırsanız, bu eşitleme ilkelleri için belirli bir hata durumu olduğunu unutmayın: WAIT_ABANDONED, ilkel tutulan son bir iş parçacığı (veya örtük, işlemin ana iş parçacığı) tarafından WaitForSingleObject ve arkadaşları tarafından döndürülür. temiz bir şekilde serbest bırakmadan sonlandırıldı. Temel olarak, bu, veri aktarımı için aşamalı bir işlem yaklaşımı kullanmanız gerektiği anlamına gelir; böylece, sonlandırma sırasında değiştirilmekte olan olası tutarsız durumu görmezden gelebilirsiniz.

+0

Bu iyi bir (+1) cevaptır; bakınız İplik emniyeti (iyi) ve tüm pratik amaçlar için sorumlu olan Global Tercüman Kilidi'nin nerede yapıldığı python iş parçacığı, çok iş parçacıklı kodları tek bir çekirdekle (kötü) sınırlar. Bu soruna en iyi çözüm, iş parçacığı değil, çok işlemcili paket ile işlemler yapmak ve bu anlık yetenekle elde edilen, birden fazla makinede ölçeklenerek elde edilmesi ve sonuçta büyük ölçeklendirme için gerekli hale gelmesidir. İplik güvenliği konusunda endişe etmek yerine, Delphi'de kolay (daha kolay) çoklu işlem yönetimine sahip olmak daha iyi olacaktır. –

+0

Semapforlar “terk edilmiş” bir devlete sahip değildir çünkü onlar yerleşik bir mülkiyet kavramına sahip değildir. (İşletim sistemi söz konusu olduğunda, bir iş parçacığı bir semaforu "tutamaz". Yalnızca bir muteks algılanabilir şekilde terk edilebilir. –

+0

Bu, engelleme kodları ile kesintili görevleri uygulamak için iyi bir yol olabilir, ancak sorudaki (anonim yöntemler için kesintili bir görev) Delphi ile nasıl uygulanacağını göremiyorum. Anonim bir yöntemden (farklı bir işlem olarak oluşturulacak) bir yürütülebilir dosya oluşturmak için bir çalışma zamanı derleyicisi olması gerekirdi, orada olmaz mıydı? – mghie

İlgili konular