Çoklu İş Parçacığı Kullanımı: MFC'de Çalışan İş Parçacıkları Oluşturma
Çalışan iş parçacığı genellikle kullanıcının uygulamanızı kullanmaya devam etmesi için beklememesi gereken arka plan görevlerini işlemek için kullanılır. Yeniden hesaplama ve arka plan yazdırma gibi görevler, çalışan iş parçacıklarına iyi örneklerdir. Bu konu, bir çalışan iş parçacığı oluşturmak için gereken adımları ayrıntılarıyla açıklar. Konu başlıkları şunlardır:
Çalışan iş parçacığı oluşturmak görece basit bir görevdir. İş parçacığınızı çalıştırmak için yalnızca iki adım gerekir: denetim işlevini uygulama ve iş parçacığını başlatma. CWinThread'den bir sınıf türetmek gerekli değildir. özel bir sürümüne CWinThread
ihtiyacınız varsa bir sınıf türetebilirsiniz, ancak çoğu basit çalışan iş parçacığı için gerekli değildir. Değişiklik yapmadan kullanabilirsiniz CWinThread
.
İş Parçacığını Başlatma
İki aşırı yüklenmiş sürümü vardır: yalnızca çalışan iş parçacıkları oluşturabilen bir sürüm ve hem kullanıcı arabirimi iş parçacıkları hem de çalışan iş parçacıkları oluşturabilen bir sürüm AfxBeginThread
. İlk aşırı yüklemeyi kullanarak çalışan iş parçacığınızın yürütülmesine başlamak için aşağıdaki bilgileri sağlayarak AfxBeginThread'i çağırın:
Denetim işlevinin adresi.
Denetim işlevine geçirilecek parametre.
(İsteğe bağlı) İş parçacığının istenen önceliği. Varsayılan değer normal önceliktir. Kullanılabilir öncelik düzeyleri hakkında daha fazla bilgi için bkz . Windows SDK'sında SetThreadPriority .
(İsteğe bağlı) İş parçacığı için istenen yığın boyutu. Varsayılan değer, oluşturma iş parçacığıyla aynı boyut yığınıdır.
(İsteğe bağlı) İş parçacığının askıya alınmış durumda oluşturulmasını istiyorsanız CREATE_SUSPENDED. Varsayılan değer 0'dır veya iş parçacığını normal şekilde başlatın.
(İsteğe bağlı) İstenen güvenlik öznitelikleri. Varsayılan değer, üst iş parçacığıyla aynı erişimdir. Bu güvenlik bilgilerinin biçimi hakkında daha fazla bilgi için bkz . Windows SDK'sında SECURITY_ATTRIBUTES .
AfxBeginThread
sizin için bir CWinThread
nesne oluşturup başlatır, başlatır ve adresini döndürür; böylece daha sonra başvurabilirsiniz. Oluşturma işleminin herhangi bir bölümü başarısız olursa tüm nesnelerin serbest bırakıldığından emin olmak için yordam boyunca denetimler yapılır.
Denetim İşlevini Uygulama
Denetim işlevi iş parçacığını tanımlar. Bu işlev girildiğinde, iş parçacığı başlatılır ve iş parçacığı çıktığında iş parçacığı sonlandırılır. Bu işlev aşağıdaki prototipe sahip olmalıdır:
UINT MyControllingFunction( LPVOID pParam );
parametresi tek bir değerdir. İşlevin bu parametrede aldığı değer, iş parçacığı nesnesi oluşturulduğunda oluşturucuya geçirilen değerdir. Denetim işlevi bu değeri istediği şekilde yorumlayabilir. Skaler değer veya birden çok parametre içeren bir yapı işaretçisi olarak değerlendirilebilir veya yoksayılabilir. Parametre bir yapıya başvuruyorsa, yapı yalnızca çağırandan iş parçacığına veri geçirmek için değil, aynı zamanda iş parçacığından çağırana verileri geri geçirmek için de kullanılabilir. Verileri arayana geri geçirmek için böyle bir yapı kullanırsanız, iş parçacığının sonuçlar hazır olduğunda çağıranı bilgilendirmesi gerekir. Çalışan iş parçacığından arayanla iletişim kurma hakkında bilgi için bkz . Çoklu İş Parçacığı Kullanımı: Programlama İpuçları.
İşlev sonlandırıldığında sonlandırma nedenini belirten bir UINT değeri döndürmelidir. Genellikle bu çıkış kodu, farklı hata türlerini gösteren diğer değerlerle başarıyı göstermek için 0'dır. Bu tamamen uygulamaya bağlıdır. Bazı iş parçacıkları nesnelerin kullanım sayılarını koruyabilir ve bu nesnenin geçerli kullanım sayısını döndürebilir. Uygulamaların bu değeri nasıl alabileceğini görmek için bkz . Çoklu İş Parçacığı Kullanımı: İş Parçacıklarını Sonlandırma.
MFC kitaplığıyla yazılmış çok iş parçacıklı bir programda yapabileceklerinizle ilgili bazı kısıtlamalar vardır. Bu kısıtlamaların açıklamaları ve iş parçacıklarını kullanma hakkında diğer ipuçları için bkz . Çoklu İş Parçacığı Kullanımı: Programlama İpuçları.
İşlevi Denetleme Örneği
Aşağıdaki örnekte, bir denetim işlevinin nasıl tanımlanacağı ve programın başka bir bölümünden nasıl kullanılacağı gösterilmektedir.
UINT MyThreadProc( LPVOID pParam )
{
CMyObject* pObject = (CMyObject*)pParam;
if (pObject == NULL ||
!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
return 1; // if pObject is not valid
// do something with 'pObject'
return 0; // thread completed successfully
}
// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.