Uruchomienie funkcji z wątku na rzecz innego obiektu ( wielowątkowy serwer, SFML 2,1 )
Ostatnio zmodyfikowano 2014-09-04 18:50
pekfos |
» 2014-09-03 21:51:41 Modyfikujesz wskaźnik, a nie wartość przekazywaną przez wskaźnik. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-09-03 21:54:39 ale ja chce żeby p_messages dostało adres obiektu (czyli dostęp do obiektu) MessagesCointainer::Message * message = new MessagesCointainer::Message; , który zdecydowanie nie jest obiektem lokalnym, bo korzystam później z tego obsługując pakiet (kod w poporzednim poscie) |
|
pekfos |
» 2014-09-03 21:59:07 ale ja chce żeby p_messages dostało adres obiektu (czyli dostęp do obiektu) |
No dobra, niech ci będzie. Lokalna kopia wskaźnika p_messages zmienia wartość na adres nowego obiektu. Co dalej..? |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-09-03 22:02:08 no właśnie dlaczego lokalna kopia? nie ma byc żadnej kopii tego wskaźnika, p_messages ma byc przekazane jako oryginał i przy przyjściu wiadomośći ma być ustawiaone na tą wiadomośc w pamięci, by móc tą wiadomośc obsłużyć gdzie indziej (tu: if( p_message != NULL ) { if( p_message->user == "serwer_addfriend" ) { delete p_message; } else { for( int i = 0; i < Core::client.Messages.size(); i++ ) { if( Core::client.Messages[ i ]->GetUser() == p_message->user ) { Core::client.Messages[ i ]->GetMessages().push_back( p_message ); break; } } m_chatwindow->AddMessage( guimessage ); } p_message = NULL; }
) |
|
pekfos |
» 2014-09-03 22:03:58 Z identycznego powodu, dla którego zwykłe przekazanie inta operuje na kopii. Przekazujesz wskaźnik przez wartość. Jak chcesz operować na oryginale wskaźnika, to przekazuj wskaźnik przez wskaźnik, albo referencję na wskaźnik. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-09-03 22:09:08 no ze wskaźnikiem przez referencje ( MessagesContainer::Messages *& p_messages ) kombinowałem i nie działa. sprawdzam czy przechodzi warunek != NULL i nie jets ten warunek spełniony, czyli wskaźnik nadal jest == NULL |
|
pekfos |
» 2014-09-03 22:11:20 "Mam sobie kod i mi nie działa :( Jakieś sugestie..?" |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-09-03 22:18:42 naprawde twoj sarkazm motywuje... client.cpp void Client::RecevingDataThread( MessagesCointainer::Message *& p_message ) { cout << "Client::RecevingDataThread" << endl; Packet packet; while( socket->receive( packet ) == Socket::Done ) { MessagesCointainer::Message * message = new MessagesCointainer::Message; int a; packet >> message->user >> message->message >> a; message->date = time( NULL ); cout << "A: " << a << endl; cout << "From: " << message->user << " Time: " << ctime( & message->date ) << " " << message->date << "\n\t " << message->message << endl; p_message = message; packet.clear(); } }
C_Working.cpp praca głównego programu C_Working::C_Working() { cout << " CTOR C_Working" << endl; p_message = NULL; }
C_Working::State C_Working::Show( RenderWindow * okno ) { auto f = std::bind( & Client::RecevingDataThread, & Core::client, p_message ); Core::client.receivingdataThread = new Thread( f ); Core::client.receivingdataThread->launch(); return Work( okno ); }
C_Working::State C_Working::Work( RenderWindow * okno ) { Event event; Vector2i mouse; float accumulator = 0.f; Time elapsed; Clock clock; while( true ) { mouse = Mouse::getPosition( * okno ); while( okno->pollEvent( event ) ) { } accumulator += elapsed.asSeconds(); if( accumulator > 0.4f ) { accumulator = 0.4f; } for(; accumulator >= TIME_STEP; accumulator -= TIME_STEP ) { if( p_message != NULL ) { cout << "p_message != NULL" << endl; if( p_message->user == "serwer_addfriend" ) { delete p_message; } else { cout << "else" << endl; for( int i = 0; i < Core::client.Messages.size(); i++ ) { if( Core::client.Messages[ i ]->GetUser() == p_message->user ) { cout << "pushing back message " << endl; Core::client.Messages[ i ]->GetMessages().push_back( p_message ); break; } } ChatWindow::Message * guimessage = new ChatWindow::Message( p_message ); guimessage->shape.setFillColor( Color( 200, 200, 200 ) ); guimessage->text.setFont( Core::font ); m_chatwindow->AddMessage( guimessage ); } p_message = NULL; } okno->clear(); okno->display(); } elapsed = clock.restart(); } }
wywoływane Core.cpp void Core::Working() { C_Working * working = new C_Working; C_Working::State result = working->Show( okno ); switch( result ) { case C_Working::Exiting: Core::state = Program::Exiting; break; case C_Working::LogOut: Core::state = Program::SplashScreen; break; } delete working; }
chyba starczy, nie? |
|
1 « 2 » 3 |