Qt thread server - problém s čekáním – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Qt thread server - problém s čekáním – C / C++ – Fórum – Programujte.comQt thread server - problém s čekáním – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
jaspys0
Duch
15. 4. 2012   #1
-
0
-

Zdravím, chtěl bych udělat server (se spojením TCP), který bude připojené clienty obsluhovat každého zvlášť v threadu. Mám třídu Server (dědí QTcpServer) a jeho reimplementovanou funkci incomingConnection(), kde vytvořím nový thread: 

Thread *thread = new Thread(this, socketDescriptor);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();

    connect(thread, SIGNAL(acceptedRequest(QString)), this, SLOT(acceptedRequest(QString)));

poté:

void Thread::run() {

    // pokud nepujde novemu socketu nastavit predavany descriptor
    tcpSocket = new QTcpSocket();
    if(!tcpSocket->setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocket->error());
        return;
    }

    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receivingRequest()));

    //emituji signal o odeslani pozadavku na login
    emit acceptedRequest("NEW");

    exec();

}

  Po prvním připojením proběhne vše v pořádku. Clientovi je odeslán požadavek na login. Jenže odpověď která přijde už není serverem zpracována. Thread je už "mrtví" a na nic nereaguje.

Nevím jak mám zajistit, aby byl thread spuštění a čekal na další příchozí požadavek.

Díky za každý tip

Nahlásit jako SPAM
IP: 84.16.113.–
býval jsem fit, teď jsem jenom FIT
Reklama
Reklama
ingiraxo+15
Grafoman
15. 4. 2012   #2
-
0
-

a proč vůbec chceš pro každýho klienta thread? Prvně si řekni, kolik plánuješ max připojených klientů... pokud do 100, tak není důvod řešit vlákna.. kdyžtak tam hodit ThreadPool a ať se stará

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
jaspys0
Duch
15. 4. 2012   #3
-
0
-

Já chci navázané spojení udržet a komunikovat v něm třeba 2 minuty nepřetržitě (tzn. otázka - odpověď) pak třeba 5minut čekat a zase komunikace. To nevím jestli by to bez těch threadu šlo. Tam je podle mě možno vytvořit více socketů, ale nevím jak bych se v nich vyznal. 

Thready chci použít i kvůli tomu, že jeden client může mít i dvě paralelní komunikace a to bych chtěl řešit novým připojením od clienta a tudíš novým threadem na straně serveru.

Ten ThreadPool je zajímavý, ten mě nenapadnul. Ale pořádně nevím jak to naimplementovat a zda to vůbec nějako takto jde...

Nahlásit jako SPAM
IP: 84.16.113.–
býval jsem fit, teď jsem jenom FIT
ingiraxo+15
Grafoman
16. 4. 2012   #4
-
0
-

TCP si narozdíl od UDP drží spojení dokud ho nějaká strana ručně neukončí a pokud to řešíš asynchroně, tak pro komunikaci opravdu není nutný používat vlakna a kór pro kaýdej soket, kdyby bylo třeba 200 klientu, tak 200 vláken je celkem znát už, ty taky něco žerou

Tcp komunikace se řeší asynchroně a používáš pouze určitej počet vláken,(třeba 15) a ty se starají o všechny klienty a to jich může být třeba 1000

Ale většinou si 1 vlákno vystačí kolem 100-200 klientů, dneska máš celkem výkoný CPU, takže klidně i víc (pokud jde pouze o čistou komunikaci)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
jaspys0
Duch
16. 4. 2012   #5
-
0
-

#4 ingiraxo
Aha díky za radu.

Ale abych ti osvětlil můj problém. Mám server který slouží jako repozit a zároveň se na něj mohou spouštět simulace. Clienta, který se připojí na server pomocí jména a hesla. Může si ze serveru natáhnout nějaký soubory (jedna funkcionalita) a nebo požádat o simulaci (druhá). Ta trvá např. dvě minuty (každou sekundu se něco pošle). Bohužel si těch simulací může spustit více.

Takže asi pokud by to šlo, clienty bych řešil normálně. Předat do funkce pro obsluhu socketDescriptor? A pokud by byl požadavek na simulaci, tak až poté vytvořit thread se simulací (předal bych asi také socketDescriptor).

Nebo jsem dostal tip, abych na clientovi (při druhé+ simulaci) začal novou instanci clienta - připojit se znovu na server. Ale simulaci bych asi musel řešit také v novém vlákně.

Nahlásit jako SPAM
IP: 84.16.113.–
býval jsem fit, teď jsem jenom FIT
ingiraxo+15
Grafoman
16. 4. 2012   #6
-
0
-

Descriptor by si musel předat tak, či tak, to je handle, kterej slouží ke spojení soketu se serverem... ono je fakt důležidý vědět, kolik plánuješ max. připojení... pokud to je do 100, tak můžeš pro každej klient jedno vlákno, pokud víc, tak orčitej počet a ať se o klienty staraj (vlákno který nemá co na práci, tak se ujme požadavku klienta, jinak klient čeká ve frontě dokud se neuvolní nějaký vlákno)

ale pokud možno, tak všechno řeš asynchroně a vlákno pouze tam, kde by to mohlo zatížit hlavní vlákno

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV+42
God of flame
16. 4. 2012   #7
-
+1
-
Zajímavé

a hlavne pocitat s velikosti zabrane pameti pro jedno vlakno... 200vlaken s defaultnimi cca 10MB na linuxu/vlakno znamena ze to chce mit 2GB ram (a na 32bitovem systemu uz se clovek nemuze dostat nad 4GB RAM - tedy teoreticky, prakticky je to o hodne mene)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jaspys0
Duch
16. 4. 2012   #8
-
0
-

mě jde např. jenom o pět současně...

#6 ingiraxo pokud bych to řešil bez vláken (u simulace), tak si závolám funkci třeba emitováním signálu. Spustí se simulace, začne odesílání dat clientu. Ale když v tom přijde další požadavek na simulaci, tak já budu muset čekat až se mi vykoná předešlá. Já bych právě chtěl, aby šli obě (více) současně. Tady asi bude hlavní vlákno nevytížené, to bude čekat na dlaší požadavky které mu přijdou. Popřípadě mu budou předávány výstupní data z vláken aby je posílal.

a jak to myslíš asynchronně, jsem myslel že když vytvořím vlákno, tak se v něm vše dělá samo bez ohledu na ostatní vlákna. Nebo tam je nějaká synchronizace?

Nahlásit jako SPAM
IP: 84.16.113.–
býval jsem fit, teď jsem jenom FIT
ingiraxo+15
Grafoman
16. 4. 2012   #9
-
0
-

stručně řečeno asychnonizace znamená, že připojení bude ne-blokový, tzn. že pokud např. client A bude chtít něco po serveru, tak server mu to pošle a nečeká na odpověd klienta A ale jde si pokračovat dál ve svoji práci - může třeba poslat další věcí opět do network streamu

Tudiž vlákno použít pouze tam, kde je vytížení (např. server musí vytvořít archiv ze souboru a ten odeslat)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Grungy0
Super člen
17. 4. 2012   #10
-
0
-

Ešte by si to mohol riešiť takým spôsobom, že jedno vlákno len prijíma správy od všetkých klientov, správy ukladá do fronty a iné vlákna sa už budú starať o ich spracovanie tak, že si vyberú správu z fronty a spracujú. Potom tam budeš asi ešte potrebovať jedno vlákno na odosielanie plus k nemu fronta správ na odosielanie.

Je to pekná implementácia servera a naviac si môžeš doimplementovať prioritu správ, takže sa niektoré správy budú spracovávať prednostne.

Nahlásit jako SPAM
IP: 213.160.170.–
Prvý náznak hlúposti, je pocit geniality.
jaspys0
Duch
2. 5. 2012   #11
-
0
-

děkuji všem, využil jsem vaše poznatky a zdárně se to blíží ke konci :-)

A otázečka: Nevíte jak bych přiměl, aby Thread počkal na nějaký signál a pak zase pokračoval v práci. Kdyby mu šla udělat na chvilku pauza 

Nahlásit jako SPAM
IP: 147.229.93.–
býval jsem fit, teď jsem jenom FIT
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 98 hostů

Podobná vlákna

LAMP server problem — založil dalaman

Vlákno - Thread — založil Kenvelo

Thread aplikace — založil GeorgeW

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý