En iyi çözüm, çift arabelleğe alma ile bir zaman uyumsuz yazı uygulamaktır.
Zaman çizgisine bakın:
------------------------------------------------>
FF|WWWWWWWW|FF|WWWWWWWW|FF|WWWWWWWW|FF|WWWWWWWW|
'F' tampon doldurma süresini ve 'W' tamponu diske yazma süresini temsil eder. Yani arabellekleri dosyaya yazmak arasında zaman kaybı sorunu. Bununla birlikte, ayrı bir iş parçacığına yazma uygulayarak, bir sonraki arabelleği hemen doldurmaya başlayabilirsiniz:
------------------------------------------------> (main thread, fills buffers)
FF|ff______|FF______|ff______|________|
------------------------------------------------> (writer thread)
|WWWWWWWW|wwwwwwww|WWWWWWWW|wwwwwwww|
F - 1. tampon doldurma
f - 2. tampon doldurma
W - dosyaya 1. tampon
yazma w - dosyaya 2. tampon yazma
_ - işlem tamamlandığında bekleyin
Tampon swapları ile bu yaklaşım, bir tamponun doldurulması daha karmaşık hesaplama gerektirdiğinde (dolayısıyla daha fazla zaman) çok yararlıdır. Her zaman içinde zaman uyumsuz yazma gizler bir CSequentialStreamWriter sınıfı uygulamak, böylece son kullanıcı için arabirim sadece yazma işlevleri vardır.
Ve arabellek boyutu disk kümesi boyutunun katı olmalıdır. Aksi takdirde, bitişik 2 disk kümesine tek bir arabellek yazarak düşük performans elde edersiniz.
Son tamponun yazılması.
Yazma işlevini son kez çağırdığınızda, geçerli arabelleğin doldurulmakta olduğundan emin olmanız gerekir. Bu nedenle, CSequentialStreamWriter'ın, verilerin son kısmını diske yazması gereken Finalize (son tampon yıkaması) diyelim ayrı bir yöntemi olmalıdır.
Hata yönetimi.
Kod 2. arabelleği doldurmaya başlarken ve birincisi ayrı bir iş parçacığına yazılır, ancak yazma bir nedenle başarısız olursa, ana iş parçacığı bu hatanın farkında olmalıdır.
------------------------------------------------> (main thread, fills buffers)
FF|fX|
------------------------------------------------> (writer thread)
__|X|
Bir CSequentialStreamWriter arabiriminin Yazma işlevinin bool döndürdüğünü veya bir istisna attığını varsayalım, bu nedenle ayrı bir iş parçacığında bir hata olması durumunda, bu durumu hatırlamanız gerekir, bu nedenle ana iş parçacığında bir dahaki sefere Yazma veya Sonlandırmayı çağırdığınızda, yöntem geri döner Yanlış ya da bir istisna atacak. Ve hatadan sonra bazı veriler yazmış olsanız bile, hangi noktada bir tampon doldurmayı bıraktığınız önemli değildir - büyük olasılıkla dosya bozuk ve işe yaramaz olacaktır.