Artariel Mesaj tarihi: Ağustos 5, 2011 Mesaj tarihi: Ağustos 5, 2011 c'de server yazarken multithreaded mi yazılması daha avantajlıdır ? yani her client için bir thread, onun dışında main'de yürütülen işlemler (ne bileyim oyunsa karakterlerin konumlarının updateleri falan). bunun bana ne gibi bir zararı olur ? hayır diyorsanız diğer yöntemleri de avantajlarıyla söyler misiniz bi de bişey daha sorayım hazır ilgili başlık açmışken. bir clienti disconnect ediyoruz diyelim, client için ayrı bir class var ve disconnect fonksiyonu da bu classın içinde. içinde closesocket bilmemne var : void client::disconnect() { closesocket shutdown clients[id]=NULL; <- bu global bir değer, pointer dizisi delete this; <- sorum burda işte. classın içinde classı sildirirsem eror meror alır mıyım ? }
senko Mesaj tarihi: Ağustos 5, 2011 Mesaj tarihi: Ağustos 5, 2011 ilk soruna hitaben, nasi bi yapcan? basit bi odev flnsa hic kastirma thread, ama coklu kullanicilar baglancaksa lazim threading. c++'ta yaziyorsun sanirim, disconnecti bi kere kullancagina gore icinde diger classi sildirmen sorun olmaz gibime geldi ama, kesin bilgim yok. en saglami sen bi dene error verirse dusunuruz :)
Delyyyy Mesaj tarihi: Ağustos 5, 2011 Mesaj tarihi: Ağustos 5, 2011 senko'nun dediği gibi ödevse ve threading özellikle istenmiyorsa hiç uğraşma. Ha öğrenecem bilader diyorsan sana kalmış, ama biraz zamanını yer. Gerçi örnek verdiğin class'da çoklu kullanıcı için gibi duruyor, bilemedim.
Artariel Mesaj tarihi: Ağustos 5, 2011 Konuyu açan Mesaj tarihi: Ağustos 5, 2011 disconnecti yazmamın amacı doğal olarak işte soket eroru falan çıkarsa hem clienti disconnect edip hem de diğerlerinin bunu bilmesini sağlamak zaten. ha böyle bir şey olmuyorsa çok önemli değil, server classına disconnect yazarım içinde id parametresi gereken. yok ben genel olarak sordum multithread mı yoksa async socket mi diye. @dely evet şu an yaptığım multithreadli accept kısmı şu şekilde : sv->player[cur]=new Player(cur,cvt.ClientLogin.name); sv->player[cur]->id=cur; sv->player[cur]->sock=sv->connsock; sv->client_thread[cur]=CreateThread(NULL,0,client_t,sv->player[cur],0,NULL); sv->playercount++; thread ise şu DWORD WINAPI client_t(LPVOID arg) { bool respond=1; while(sv->loop && respond) { if (!((Player*)arg)->RecvPack()) // gelenleri al respond=0; // kes cezayı } ((Player*)arg)->Disconnect(); ExitThread(0); }
Artariel Mesaj tarihi: Ağustos 6, 2011 Konuyu açan Mesaj tarihi: Ağustos 6, 2011 buldum sanırım http://www.geekinterview.com/question_details/16831 http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15 kısacası yok ben vazgeçtim. disconnecti kullandıktan sonra başka yerde sildiririm memberı. c++nın destructor olayı basit gibi görünüyor da çoğu kitapta falan açıklanmamış ayrıntıları var. şu site acayip iyi anlatıyor http://www.parashift.com/c++-faq-lite/dtors.html bana kalsa, destructorda pointer memberları kendim tekrar sildirecem, eror alacam. edit : site cidden güzelmiş ya kafamda soru kalmadı bellek yönetimiyle ilgili
Kojiroh Mesaj tarihi: Ağustos 6, 2011 Mesaj tarihi: Ağustos 6, 2011 delete this çok sakat. Bi obje bellekten silinecekse bunu o objenin sahibi yapmalı, kendisi değil. Clientları da array içinde değil de, array'i wrap eden ClientList şeklinde kendi yazdığın bi sınıf içinde saklamak daha sağlıklı. Hatta çok elzem değilse pointer değil referans şeklinde tut. Hatta ve hatta ben olsam disconnect metodunu DisconnectClient(client& cl) şeklindeki bi fonksiyonla ClientList sınıfına yaptırırdım, client objeleri destruct edilirken kendi soket bağlantılarını kapatırdı.
Öne çıkan mesajlar