Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » boost.thread -> nach exec im hauptthread etwas ausführen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.04.2009, 18:38 Uhr
~xxx_loggedoff
Gast


Also ich hab folgendes Problem:
Hab nen Berechnungsvorgang der relativ dauert (okay nur paar sec aber is in dem Fall zu lange ). So jetzt hab ich mit boost.asio im Hauptthread nen Server gestart. Ehm soweit kein Problem ... kann Nachrichten hin und her schicken ... das ganze ist async gemacht ... eh gut mehr braucht man nicht wissen denk ich . Nun wird bei einer speziellen Nachricht aber dieser lange Vorgang ausgeführt und nach diesem dann ne Antwortnachricht geschickt. Nun wollte ich hingehen und einfach einen neuen Thread für die Berechnung starten und dann würde ich nur gerne, wenn der Thread fertig ist, hingehen und im Hauptthread die Antwortnachricht verschicken. Wie mach ich das am besten? Der Hauptthread darf ja nicht auf das beenden Warten ... sonst verliehre ich die Verbindung ^^

Besten Dank

(Ehm meine Deadline ist Sonntag abend ... also wäre cool wenn ich das Problem mit eurer Hilfe bis dahin gelöst hätte )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2009, 19:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja du solltest allgemein nichts im hauptthread machen.

also machs doch so, du forkst 2 threads, in einem läuft der server, der hat ne queue, da haut er alles rein was er empfängt, und ne queue von der er immer alles abarbeitet zum verschicken.

der arbeitsthread schaut dann eben immer in der queue nach "ah ich hab was zu tun", und legt seine antwort in die sende-queue.

wichtig hier nur: solltest die queues mit nem mutex sichern hast ja nebenläufigkeit, theoretisch könnte man das auch mit ner semaphore machen, die legt dann den arbeitsthread schlafen wenn er nach work sucht, aber z.b zurzeit keine kriegt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.04.2009, 19:51 Uhr
xXx
Devil


Hm also ich hab das Glück das ich davon ausgehen kann, dass mir während dessen keine andere Nachricht in dieser Session geschickt wird Bzw. es sollte eigtl. gehen das ich einfach für diese Session einen Arbeitsthread erzeuge ...

C++:
if (!m_thread) m_thread = new boost::thread(&Session::operation_func, this, shared_from_this());

Im d-tor dann

C++:
if (m_thread) m_thread->join(); delete m_thread;

c-tor
C++:
: m_thread(NULL)
..

Allerdings brauch ich im Thread dann ja zugriff auf den Hauptthread, bzw. auf das Objekt was in dem erstellt wurde ... deswegen hab ich mir ja auch einen shared_ptr davon übergeben lassen.


C++:
void Session::operation_func(boost::shared_ptr<Session> ptr_this)
{
    functor(*ptr_this, xy)(5); // functor nimmt ne ref. von der Basisklasse von Session
    Message msg(ID);
    deliver (msg); // Message const&
}


So geht auch bis zu deliver .. da wird die application in unusal way geschlossen ...

Dieser Post wurde am 18.04.2009 um 22:09 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.04.2009, 20:14 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich jetzt richtig verstehe, worauf du hinaus willst, wäre das wohl mit der timed_join-Methode von boost.thread am einfachsten. Etwa so (völlig ungetestet):

C++:
while(!thread_.timed_join(boost::posix_time::milliseconds(500))) {
  keep_connection_alive();
}

send_answer_packet();


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.04.2009, 14:34 Uhr
~xxx_loggedoff
Gast


Würde ich ja gerne so machen nur leider bietet, soweit ich das jetzt überblicke, boost.asio keine möglichkeit explizit zu sagen das die Verbindung erhalten werden soll. Ich könnte höchstens hingehen und solange eine Ping-Pong-Message senden Oder kennt sich da einer besser mit boost.asio aus? oder kann mir sagen warum oben der Fehler kommt?

Danke schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: