Aracılığıyla paylaş


Çoklu İş Parçacığı Kullanımı: Çalışan İş Parçacığı Oluşturma

Arka plan iş parçacığı, kullanıcının uygulamanızı kullanmaya devam etmesi için beklemek zorunda kalmadığı arka plan görevlerini işlemekte yaygın olarak kullanılır. Yeniden hesaplama ve alt yapı baskısı gibi görevler, çalışmacı dizilerinin iyi örnekleridir. Bu konu, çalışan iş parçacığı oluşturmak için gereken adımları ayrıntılı bir biçimde açıklamaktadır. Konular:

  • İş parçacığının başlatılması

  • Denetim işlevini uygulama

  • Örnek

Bir iş parçacığı oluşturmak göreceli olarak basit bir görevdir. İş parçacığınızın çalışması için yalnızca iki adım gereklidir: denetleme işlevini uygulamak ve iş parçacığını başlatmak. CWinThread öğesinden bir sınıf türetmek gerekli değildir. CWinThread'in özel bir sürümüne gereksinim duyarsanız, bir sınıf türetebilirsiniz; ancak bu en basit işçi iç parçacıkları için gerekli değildir. CWinThread değişiklik yapmadan kullanılabilir.

İş Parçacığının Başlatılması

AfxBeginThread öğesinin iki aşırı yüklü sürümü var: kullanıcı arabirimi iş parçacıklarına ilişkin olan, çalışan iş parçacıklarına ilişkin olan. İşçi iş parçacığınızı yürütmek için aşağıdaki bilgileri sağlayan AfxBeginThread öğesini arayın:

  • Denetleme fonksiyonu adresi.

  • Denetleme işlevine geçirilen parametre.

  • (İsteğe bağlı) İş parçacığının istenen önceliği. Varsayılan normal önceliktir. Varolan öncelik düzeyleri hakkında daha fazla bilgi için Windows SDK paketindeki SetThreadPriority konusuna bakın.

  • (İsteğe bağlı) İş parçacığının istenen yığın boyutu. Varsayılan oluşturulan 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 öğesini tıklatın. Varsayılan 0'dır ya da iş parçacığını normal olarak başlatın.

  • (İsteğe bağlı) İstenen güvenlik öznitelikleri. Varsayılan, ana iş parçacığıyla aynı erişimdir. Bu güvenlik bilgisi biçimi hakkında daha fazla bilgi için Windows SDK paketindeki SECURITY_ATTRIBUTES konusuna bakın.

AfxBeginThread, sizin için CWinThread nesnesi oluşturur, başlatır ve çalıştırır ve daha sonra kendisine başvurabilmeniz için adresini döndürür. Oluşturmanın herhangi bir bölümünün başarısız olması durumunda tüm nesnelerin doğru şekilde kaldırıldığından emin olmak için prosedür boyunca denetimler gerçekleştirilir.

Denetim İşlevini Uygulama

Denetleyen işlev iş parçacığını tanımlar. Bu işlev girildiğinde, iş parçacığı başlar ve çıktığında iş parçacığı sonlanır. Bu işlev, aşağıdaki prototipi içermelidir:

UINT MyControllingFunction( LPVOID pParam );

Parametre tek bir değerdir. Bu parametrede işlevin aldığı değer, iş parçacığı nesnesi oluşturulduğunda oluşturucuya geçen değerdir. Denetleyen işlev bu değeri seçtiği herhangi bir şekilde yorumlayabilir. Skalar değeri veya çoklu parametre içeren bir yapıya işaretçi olarak görülebilir veya yok sayılabilir. Parametre bir yapıya başvurursa, yapı yalnızca arayandan iş parçacığına veri geçişinde değil, ayrıca iş parçacığından arayana veri geçişinde de kullanılabilir. Veriyi çağrıyı yapana geri geçirmek için böyle bir yapı kullanıyorsanız, sonuçlar hazır olduğunda iş parçacığının çağrıyı yapana bunu bildirmesi gerekir. Çalışan iş parçacığından arayana iletişim hakkında bilgi için bkz. Çoklu İş Parçacığı Kullanımı: Programlama İpuçları.

İşlev sonlandığında, sonlanma nedenini gösteren bir UINT değeri döndürmelidir. Genellikle bu çıkış kodu 0'dır ve farklı hatalar gösteren diğer değerler ile ilgili başarıyı gösterir. Bu tamamen uygulamaya bağlıdır. Bazı iş parçacıkları nesnelerin kullanım sayısını içerebilir ve o nesnenin geçerli kullanım sayısını döndürebilir. Uygulamaların bu değeri nasıl alabildiğini görmek için bakınız: Çoklu İş Parçacığı Kullanımı: İş Parçacıklarını Sonlandırmak.

MFC kitaplığı ile yazılan çok iş parçacığı içeren bir programda yapabilecekleriniz konusunda bazı kısıtlamalar var. Bu kısıtlamalar ve iş parçalarını kullanma hakkında diğer ipuçları için bkz. Multithreading: Programlama İpuçları.

Denetleme işlevi Örneği

Aşağıdaki örnek bir denetleyen işlevin nasıl tanımlandığını ve programın başka bir kısmından nasıl kullanıldığını gösterir.

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);
.
.
.

Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Kavramlar

C++ ve MFC ile Çoklu İş Parçacığı Kullanımı