C GTK+ 2.0 i named pipes, tworzenie gry 2 osobowej

0

Witam serdecznie
Napotkałem na problem przy tworzeniu gry 2 osobowej. W skrócie gra ma polegać na odkrywaniu przez 2 graczy na przemian 2 ikonek na polu 6x6, jeśli odkryte ikony będą takie same to ikony zostają usunięte a w przeciwnym przypadku, turę rozpoczyna 2 gracz i ikony z powrotem zostają zakryte. Stworzyłem sobie w gtk+ planszę złożoną z 36 przycisków i do każdego podłączyłem funkcję wywoływaną przy zdarzeniu 'clicked'. I tutaj rodzi się mój problem. Poniżej wklejam kod mojej funkcji:

 


void odkryjObrazek(GtkButton *wcisniety_przycisk, gpointer numer_przycisku){
    //odkrycie ikony przypisanej danemu numerowi przycisku, adres ikony jest zapisany w strukturze tab
    GtkWidget *image;
    image = gtk_image_new_from_file (tab[(int) numer_przycisku].obrazek);
    gtk_button_set_image (wcisniety_przycisk, image);

    /*warunek sprawdzajacy czy gracz nie nacisnal 2 tych samych przyciskow, czy jest to jego 2 ruch i czy obrazki sie zgadzaja, jesli tak to, przycisku zostaja usuniete i do tablicy znakow (ktora bede wykorzystywal do zapisania do potoku) sa zapisywane zera, zeby drugi proces wiedzial, ktore obrazki zostaly odkryte*/
    if (((int) numer_przycisku != poprzedni) && iloscRuchow % 2 != 1 && (sprawdzenieObrazkow ((int) numer_przycisku, poprzedni) == 1)){
        gtk_widget_destroy(GTK_WIDGET(przycisk[(int)numer_przycisku]));
        gtk_widget_destroy(GTK_WIDGET(przycisk[poprzedni]));
        obrazki[poprzedni] = 0;
        obrazki[ (int)numer_przycisku ] = 0;
        pozostalePrzyciski--;
        iloscRuchow = 0;
    }

    /* ta petla jest wykonywana w momencie, kiedy gracz odkryje 2 inne ikony, zostana one zakryte i bedzie wykonany zapis do potoku, a potem program bedzie oczekiwal az drugi proces wykona swoj ruch, wiem, ze na razie brakuje odczytu informacji z potoku ale to pozniej.*/
    else if ((int) numer_przycisku != poprzedni && iloscRuchow % 2 != 1){
        GtkWidget *blank;
        blank = gtk_image_new_from_file ("icons/blank.png");
        gtk_button_set_image(GTK_BUTTON(przycisk[poprzedni]), blank);
        fdcnt = open(fifocnt, O_WRONLY);
        write(fdcnt, obrazki, sizeof(obrazki));
        fdsrv = open(fifosrv, O_RDONLY);
        read(fdsrv, obrazki, sizeof(obrazki));
    }

    poprzedni = (int) numer_przycisku;
    iloscRuchow++;
}

Moim problemem jest to, ze po klikniecu 1 przycisku, ikona sie odkrywa i wszystko jest w porzadku, po nacisnieciu 2 (innej), nie zostaje ona odkryta tylko, przycisk zostaje wcisniety i wykonywana zostaje instrukcja czytania z potoku, ktora w funkcji jest zapisana pozniej od linijki w ktorej przyciskowi powinna zostać przypisana ikona. Dopiero po wykonaniu ruchu 2 gracza przycisk sie zwalnia i ikona sie odkrywa, a chcialbym zeby odkrywala sie od razu po kliknieciu i wtedy dopiero moglaby zostac wykonana komenda read. Nie wiem dlaczego tak sie dzieje i probowalem juz kilku rozwiazan i brakuje mi pomyslow. Jesli ktos bylby w stanie mi pomoc z gory serdecznie dziekuje.

0

W GTK napisałem co prawda tylko jeden program ale zastanawiam się czy przypadkiem nie chodzi o coś takiego:
Wczytujesz coś w wywołanej funkcji a dopiero potem wracasz do głównej pętli programu, w której możliwa jest zmiana wygląda "grafiki" (taki duży skrót myślowy). Jednym słowem przed wczytaniem masz oczekujące komunikaty, które nie mogą zostać jeszcze obsłużone, bo blokuje to czytanie (read) wewnątrz funkcji.

Możesz to sprawdzić, wrzucając przed wczytywanie:

while(gtk_events_pending()) {
    gtk_main_iteration();
}

Jak napisałem herezje to nie palcie mnie na stosie :D

0

dzięki wielkie, też próbowałem sobie właśnie to tak mniej więcej wytłumaczyć, bo innego sensu nie widziałem. zaraz sprawdzę jak się program będzie zachowywał po wrzuceniu tego fragmentu kodu do funkcji

1 użytkowników online, w tym zalogowanych: 0, gości: 1