Új hozzászólás Aktív témák
-
Oppenheimer
nagyúr
válasz
kingabo #2507 üzenetére
Tudom mit csinál az a try-catch blokk, az előzményt is olvasd el.
Csak debugolas céljából volt ott. Végülis fölöslegesen, mert már emvy segítségével megoldódott a probléma.
Tehát az előzmény:
SO-n azt írták, hogy egy kezeletlen exception miatt meghívódik a terminate() ami meghívja az alkalmazás abort()-ját és ezért áll le.
Próbáltam, hogy try-catch blokkba elkapok mindent a függvényhívás körül, de ugyan úgy abortálódott a futás. Egyébként msdn-en semmit nem írnak arról, hogy ezek a függvények exceptiont dobnának. -
Oppenheimer
nagyúr
Először is odaadom a Socket és az UDP_Socket forrását. A thread indítása elég összetett és inkább nem adnám oda. A threadként elindított függvény egy objektum tagfüggvénye, és ezt az objektumot először inicializálom az első beérkező csomag függvényében.
Így deklarálom az objektumot:
auto forwarder = std::make_shared<RTP_proxy>();Ha a csomagban megfelelő content van és még nem létezik forwarder a forráscímhez tartozóan, akkor csinálok egy új forwardert:
forwarder = std::make_shared<RTP_proxy>(proxy_IP, rtp_addr, call_ID);Hozzáadom a forwardereket tároló map-hez:
RTP_forwarder_list[rtp_addr] = forwarder;És elindítom az új szálat:
std::thread(&RTP_proxy::run, RTP_forwarder_list[rtp_addr].get()); -
Oppenheimer
nagyúr
válasz
Oppenheimer #2499 üzenetére
Tehát az UDP_Socket operator<< függvénye lentebb olvasható (mint mondtam is, mindig működik). A sender_address és a sender_port egy std::string és uint16_t típusú, inicializált változók.
Itt megtörtént a standard outputra kiírás:
De közben felvillan a "debug error!" hibaüzenet, amiből utána ennyi látszik:
Jó, mi?
-
Oppenheimer
nagyúr
az opertor<< nem csinál semmit csak kiír. Az is mindig jól működik, kivéve ebben a szálban. Nem használ közös adatot, két külön objektumról van szó amik a saját tagváltozóit írják ki.
std::ostream& operator<<(std::ostream& os, const Socket& sock)
{
os << sock.IP_address << ":" << sock.port;
return os;
}A két szál közös adatai meg mutex-ekkel védett stl tárolók, de odáig most nem jut el a program, hogy használja is őket a második szál.
-
Oppenheimer
nagyúr
válasz
Oppenheimer #2494 üzenetére
Kicsit elrontottam a debugolási lépések leírását, nem azok a képek vannak, amikre emlékeztem.
Szóval a második képhez tartozó helyes szöveg ez lenne: várakozik is csomagra timeout nélkül, ahogy annak lennie kell.
Az első képhez meg csak annyi a komment, hogy meghívódik a recvfrom()
-
Oppenheimer
nagyúr
Részleteket tudok mutatni, és elmondom mit csináltam.
Elöljáróban annyit, hogy csináltam egy wrapper osztályt a winapi köré, hogy OO módon tudjam kezelni socketeket, és amúgy tök jól működik.
Itt az 1. számú szálon meghívódik a rcvfrom() és várakozik is csomagra timeout nélkül, ahogy annak lennie kell:
Miután küldök neki egy csomagot, azt szépen feldolgozza a szál:
Ezek után elindítja a 2. számú szálat, ami egy másik socketre hívja meg a recvfrom()-ot:
Megnyomom az F11-et (step into) és voilà:
Látom szerkesztettél és call stack kell, intézek egyet.
Itt a call stack, nyilván csak az abortot előidéző utasításig tudom megnézni: -
Oppenheimer
nagyúr
válasz
Oppenheimer #2491 üzenetére
Senkinek nincs ötlete?
-
Oppenheimer
nagyúr
válasz
Oppenheimer #2490 üzenetére
Amugy irtam kis kiegeszito programokat amikkel kiprobaltam, hogy mukodik-e amit csinalok, es mukodik. Meg ezen a programon belul is mukodik, csak azon a bizonyos szalom nem.
-
Oppenheimer
nagyúr
winapit socketet használó programot írok. Amikor egy ezzel kapcsolatot api hívást csinálok az egyik szálból, pl select(), vagy recvfrom(), akkor elszáll a program a fenti hibaüzenettel. Túrtam elég sokat a netet, de nem találtam róla semmi használhatót.
SO-n azt írták, hogy egy kezeletlen exception miatt meghívódik a terminate() ami meghívja az alkalmazás abort()-ját és ezért áll le.
Próbáltam, hogy try-catch blokkba elkapok mindent a függvényhívás körül, de ugyan úgy abortálódott a futás. Egyébként msdn-en semmit nem írnak arról, hogy ezek a függvények exceptiont dobnának.
Én arra gyanakszom, hogy a többszálúság miatt lehet, de minden socketet csak egy, a saját szálából használok. Egyébként is úgy debugoltam, hogy a másik szál aludt, mikor erre a függvényhívásra lépett az utasításszámláló.A másik furcsa jelenség a következő: overloadoltam az operator<<-t az egyik saját osztályomnak. Tökéletesen működik mindig, kivéve abban a szálban, ami a fenti hibát produkálja. Egész pontosan mikor megtörténik az outputra kiírás, akkor is dob egy ilyen hibaüzenetet, de ekkor még tovább tudom futtatni a programot. WTF?
UI: bocs, hogy nem print screeneltem, a szituációban egyszerűbb volt fotózni.
-
Oppenheimer
nagyúr
válasz
WonderCSabo #2484 üzenetére
A legtöbb példában amit láttam nem egy osztály tagfuggvenyet adták át, hanem egy globális függvényt, ezért először nem értettem, hogy miért kell 2 paraméter a thread konstruktorának, aztán végül leesett.
emvy: valóban tökmindegy, csak annyi, hogy a mainben meg be kell várni azt a szálat.
Amúgy deklaráltam egy threadeket tároló listát és abba pusholtam bele a futás közben létrehozott threadeket, aztán a létrehozó szál végén vegigiteraltam a listán és mindre meghívtam a joint, így rendben működik.
-
Oppenheimer
nagyúr
válasz
Oppenheimer #2481 üzenetére
Hazafelé menet leírom hogy mit csináltam, hátha segít majd egyszer valakinek, bár nem egy nagy mágia.
-
Oppenheimer
nagyúr
Van egy osztály, amiben van egy függvény aminek nincs paramétere és nincs visszatérési értéke. Ezt a függvényt szeretném meghívni egy másik osztályból külön szálként std:threadet használva. Ennek mi a helyes módja?
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- E-book olvasók
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Milyen billentyűzetet vegyek?
- Autós topik
- Úgy tér vissza a Commodore 64, ahogy titkon mindenki várja
- Mibe tegyem a megtakarításaimat?
- Kettő együtt: Radeon RX 9070 és 9070 XT tesztje
- Milyen routert?
- Reklámblokkolók topikja
- Gaming notebook topik
- További aktív témák...
- MacBook Pro 2019 '16 2,6 Ghz 6mag Intel Core i7 16/512gb - Space Gray Touch Bar
- Xiaomi 13T 256GB, Kártyafüggetlen, 1 Év Garanciával
- Honor Magic6 Lite 256GB, Kártyafüggetlen, 1 Év Garanciával
- Komplett új gép eladó Ryzen5 8400F nettó áron!
- Bomba ár! Lenovo ThinkPad L13 G3 - i5-1245U I 16GB I 256SSD I 13,3" FHD Touch I NBD Gari!
- BESZÁMÍTÁS! MSI B450 R5 5500 16GB DDR4 512GB SSD RTX 2060 Super 8GB Rampage SHIVA TT 500W
- DELL PowerEdge R740 rack szerver - 2xGold 6130 (16c/32t, 2.1/3.7GHz), 64GB RAM, 10Gbit HBA330, áfás
- BenQ PD-3200-U Monitor - Designer 4K 32"
- Motorola E40 64GB, Kártyafüggetlen, 1 Év Garanciával
- Bomba ár! Dell Latitude E7250 - i7-5GEN I 8GB I 256SSD I 12,5" HD I HDMI I Cam I W10 I Garancia!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest