Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Uruchomienie funkcji z wątku na rzecz innego obiektu ( wielowątkowy serwer, SFML 2,1 )

Ostatnio zmodyfikowano 2014-09-04 18:50
Autor Wiadomość
pekfos
» 2014-09-03 21:51:41
Modyfikujesz wskaźnik, a nie wartość przekazywaną przez wskaźnik.
P-116602
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)
P-116603
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..?
P-116604
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:
C/C++
if( p_message != NULL ) //OBSLUGA WIADOMOSCI
{
    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;
}
)
P-116605
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.
P-116606
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
P-116611
pekfos
» 2014-09-03 22:11:20
"Mam sobie kod i mi nie działa :( Jakieś sugestie..?"
P-116612
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-09-03 22:18:42
naprawde twoj sarkazm motywuje...
client.cpp
C/C++
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<<"Received from: "<<message->user<<endl<<"\t"<<message->message<<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/C++
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 ) )
        {
            //eventy
        }
       
        accumulator += elapsed.asSeconds();
        if( accumulator > 0.4f )
        {
            accumulator = 0.4f;
        }
       
        for(; accumulator >= TIME_STEP; accumulator -= TIME_STEP )
        {
           
            if( p_message != NULL ) //OBSLUGA WIADOMOSCI
            {
                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();
            //draw
            okno->display();
        }
        elapsed = clock.restart();
    }
}

wywoływane Core.cpp
C/C++
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?
P-116615
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona