Thread overview
C++ thread
Oct 21, 2018
hsencan
Oct 21, 2018
kerdemdemir
Oct 22, 2018
hsencan
October 21, 2018

Herkese Merhaba,

Ben kendim basit bir sudoku oyunu yapmaya çalışıyorum. Oyunda sudokuyu çözmek için özyinemeli bir fonksiyon var.
Sıkıntı şöyle eğer oyun tahtası çözülemiyecek durumda ise program donuyor. Bunu engellemek için fonksiyonu ayrı bir thread' de açıp eğer bir süre zarfında bir değer döndürmüyor ise thread'i durdurmayı düşündüm. Ama C++' ta thread durdurmak için direk bir fonksiyon olmadığını farkettim ve çuvalladım :)
Düşündüğüm thread açıp durdurmak ne kadar mantıklı ? Veya sizin önerebileceğiniz daha farklı bir yol var mıdır ?

Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 21, 2018

Öncelikle, thread kullanmak zorunda olmayabilirsin. Örneğin, öz yinelemeyi durdurma koşullarından birisi zamana bakmak olabilir.

Thread gereken bu gibi durumlarda en iyisi mesajlaşmaktır. D'de çok kolay olan bu iş[1] sanırım C++'ın standart kütüphasinde bulunmuyor. O zaman en kolayı, işçi global bir değişkenin değerini denetler:

void işçi(/* ... */) {
   while (!bitti_mi) {
   }
}

O global değişkenin değeri de ana iş parçağı tarafından ayarlanır:

   if (bir_kosul()) {
       bitti_mi = true;
   }

İş parçacıklarından haberi olmayan (ve haberinin olması beklenmeyen) derleyicinin ey iyileştirmeler sırasında bu işi bozmasını engellemek için o global değişkenin std::atomic olarak tanımlanması gerekir.

std::atomic_bool bitti_mi{false};

Tabii std::atomic kullanılması gereken böyle durumlarda std::condition_variable da kullanılabilir. (İnternette çok örneği var.)

Ali

[1] http://ddili.org/ders/d/es_zamanli.html

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 22, 2018

Hasan selam ,

Eger git adresi varsa paylasmak istermisin belki daha fazla yardimci olabiliriz. Ve senin koduna bakip senden ogrenebiliriz.

Baska bir alternatif olarak boost::asio isine yarar gibime geldi. Ne yazikki Ali abininde dedigi C++ std 'nin cok kuvvetli degil bu konuda ben kendimi boost'un kollarinda buluyorum

Benim bir ornegim asagida gorulebilir belki isine yarar:

https://github.com/kerdemdemir/sharpEar/blob/master/utility/workerThread.h

Ve ioservice 'in stop isimli bir fonksiyonu var

https://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/reference/io_service/stop.html

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 22, 2018

Alıntı (kerdemdemir):

>

Eger git adresi varsa paylasmak istermisin belki daha fazla yardimci olabiliriz. Ve senin koduna bakip senden ogrenebiliriz.

Tabi https://github.com/hsencan03/Sudoku burada sfml kütüphanesini kullandım. Galiba böyle kütüphaneler işin içine girince cmake te paylaşmak gerekiyor. (Ben bilmiyorum kullanmayı) ben direk kodları paylaştım :) Burda benim sorunum "PlayState.cpp" 130. Satır ve "SudokuSolver.cpp" dosyasının 14. Satırın da

Alıntı:

>

Benim bir ornegim asagida gorulebilir belki isine yarar:

https://github.com/kerdemdemir/sharpEar/blob/master/utilit…

Ve ioservice 'in stop isimli bir fonksiyonu var

https://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/…

Boost kütüphanesini daha önce hiç kullanmadım. C++11' in yeterli olduğunu düşünüyordum. Pekte değilmiş.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 22, 2018

Boost'a C++ standart kütüphanesinin deneme tahtası gözüyle bakabilirsin. C++11'in standart kütüphanesine eklenen olanaklardan bazıları (örneğin boost::shared_ptr ve arkadaşları) Boost'tan geldi.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]