Autor Wątek: "Maximum number of clients reached"  (Przeczytany 6527 razy)

Offline aphity

  • Użytkownik

# Sierpień 15, 2013, 17:20:46
Sprawdź drzewo procesów. Być może Twój proces albo proces UXTerma nie znika po zakończeniu programu (upewnij się też, że nie zostają procesy zombie).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 17:49:21
Raczej niema tych procesów albo coś źle patrze. Sprawdzam za pomocą ps -A. Po za tym właśnie z normalnej konsoli wyskoczył mi ten błąd. Po 45 wywołaniu programu.
« Ostatnia zmiana: Sierpień 15, 2013, 17:54:42 wysłana przez nargatte »

Offline aphity

  • Użytkownik

# Sierpień 15, 2013, 17:56:41
Jeżeli podejrzewasz że źródłem problemu może być UXTerm, to zmień go w ustawieniach C::B (np. na `konsole' albo `gnome-terminal') i zobacz czy to coś pomoże.

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 17:59:57
UXTerm raczej nie jest przyczyną bo przed chwilą pojawił się błąd na zwykłej konsoli. Przynajmniej polecenie sudo pkill X działa, lepsze to niż resetowanie komputera.
« Ostatnia zmiana: Sierpień 15, 2013, 18:04:42 wysłana przez nargatte »

Offline Xender

  • Użytkownik

# Sierpień 15, 2013, 18:28:35
Czyli problem z X serwerem. Czy poprawnie finalizujesz SDL? System operacyjny powinien posprzątać po procesie niezwolnione zasoby, ale może driver OpenGL tego nie robi i jest jakiś leak.

Offline aphity

  • Użytkownik

# Sierpień 15, 2013, 18:33:24
Żeby wyeliminować problem sterownika, spróbuj je zmienić i powtórzyć błąd. Jak rozumiem korzystasz z producenckich AMD (fglrx), sprawdź te alternatywne (radeon).

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 18:51:30
Całość tworzenia kontekstu wygląda tak :
class Window
{
    public:
        Window(int width = 800, int height = 600);
        ~Window();
        bool loop();
        SDL_Surface * screen;
    private:
        SDL_Event event;
};
Window::Window(int x, int y)
{
    static bool pierwszy = true;
    if(pierwszy)
    {
   if(SDL_Init(SDL_INIT_VIDEO)<0)
   {
        std::cout << "Nie mozna zainicjalizowac SDL\n";
        return;
   }
    screen = SDL_SetVideoMode(x,y,32,SDL_OPENGL);
    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    SDL_WM_SetCaption("Duzzle", NULL);
    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        std::cout << "GLEW ERROR\n";
        return ;
    }
    glViewport(0,0,x,y);
    pierwszy = false;
    }
}

Window::~Window()
{
    static bool pierwszy = true;
    if(pierwszy)
    SDL_Quit();
    pierwszy = false;
}

bool Window::loop()
{
    SDL_PollEvent (&event);
    switch(event.type)
    {
        case SDL_QUIT:
            return 0;
        case SDL_KEYDOWN:
            if(event.key.keysym.sym == SDLK_ESCAPE)
                return 0;
    }
    return 1;
}
Może rzeczywiście o czymś zapomniałem, może to stara metoda jest. Prawie całość jest ściągnięta z warsztatowego artykułu.

Nie mam pojęcia w jaki sposób wrócić do starych sterowników bez przeinstalowywania systemu operacyjnego.   

Offline Xender

  • Użytkownik

  • +1
# Sierpień 15, 2013, 21:14:08
Inicjalizujesz SDL przy pierwszym otwarciu okna - ok. Finalizujesz przy pierwszym (nie ostatnim) zamknięciu - FAIL.

Zmień to na licznik otwartych okien, jeśli przy tworzeniu jest ==0, SDL_Init, jeśli przy usuwaniu ==1, SDL_Quit. Albo lepiej inicjalizuj gdzie indziej.

Ten bug dotyczy tylko wielu okien, ale jest fatalny...