Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #112


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 112.  30 апреля 2011 г.

Здравствуйте, уважаемые читатели!

Сегодня предлагаем вам перевод стандарта «Рекомендации IEEE по разработке требований к программному обеспечению». Перевод публикуется частями. В данном выпуске — первая часть.

Также предлагаем подборку тем нашего форума.


Приятного чтения!




Перевод с англ.: (C) Dale, 27.04.2011 — 29.04.2011.

IEEE STD 830-1998
(Ревизия IEEE STD 830-1993)

Спонсор: Комитет по стандартам в области программной инженерии Компьютерного сообщества IEEE.

Одобрено 25 июня 1998 года Советом по стандартам  IEEE-SA.

Реферат: Описаны содержание и характеристики качественной спецификации требований к программному обеспечению (software requirements specification, SRS), приведены несколько примеров плана SRS. Эти рекомендации ориентированы на составление спецификаций требований к разрабатываемому программному обеспечению, но также могут помочь при выборе коммерческих и разработанных самостоятельно программных продуктов. Также приведены указания по согласованию со стандартом IEEE/EIA 12207.1-1997.

Ключевые слова: контракт, потребитель, прототипирование, спецификация требований к программному обеспечению, поставщик, спецификация системных требований.


Введение


(Данное введение не является составной частью Стандарта)

Данные рекомендации описывают рекомендованный подход к разработке спецификаций требований к программному обеспечению. Они основываются на модели, в которой результатом процесса разработки спецификации требований к программному обеспечению является непротиворечивый и полный документ. Они призваны помочь:

  • Потребителям программного обеспечения – точно описать, что они желают получить;
  • Поставщикам программного обеспечения – в точности понять, что хочет потребитель;
  • Специалистам – выполнить следующие задачи:
    • Разработать план стандартной спецификации требований к программному обеспечению (SRS) для нужд вашей конкретной организации;
    • Определить формат и содержание своих собственных спецификаций требований к программному обеспечению;
    • Разработать собственные дополнительные инструменты поддержки, такие, как чек-листы качества SRS или справочники разработчиков SRS.

Для потребителей, поставщиков и прочих специалистов качественная SRS должна обеспечить несколько преимуществ, в частности:

  • Установить основу для соглашения между потребителями и поставщиками о том, что должен делать программный продукт. Полное описание выполняемых программным обеспечением функций, заданное в SRS, поможет потенциальным пользователям определить, удовлетворяет ли программное обеспечение их потребности, либо каким образом его следует модифицировать для удовлетворения их потребностей.
  • Снизить трудоемкость разработки. Подготовка SRS заставляет различные заинтересованные группы в организации-потребителе тщательно рассмотреть все требования до начала разработки и уменьшить последующие перепроектирование, перекодирование и перетестирование. Внимательный пересмотр требований в SRS может выявить упущения, недоразумения и несогласованности на ранних стадиях цикла разработки, когда эти проблемы легче исправить.
  • Обеспечить основу для оценки стоимости и сроков. Описание разрабатываемого продукта, приведенное в SRS, является реалистичной основой для оценки затрат на проектирование и может быть использовано для обоснования цены.
  • Обеспечить основу для валидации и верификации. Руководствуясь хорошей SRS, организации могут гораздо продуктивнее разработать собственные планы валидации и верификации. Как часть контракта на разработку SRS обеспечивает эталон, соответствие которому может быть оценено.
  • Облегчить передачу. SRS облегчает передачу программного обеспечения новым пользователям или на новые машины. Таким образом, потребители обнаруживают, что упрощается передача программного обеспечения в другие подразделения их организации, а поставщики обнаруживают, что облегчается его передача новым потребителям.
  • Служить основой для усовершенствования. Поскольку в SRS обсуждается сам продукт, а не проект его разработки, SRS служит основой для последующего усовершенствования завершенного продукта. Может потребоваться изменение SRS, но она все равно является основой для дальнейшей оценки продукта.

Читатели данного документа могут обратиться к !!!Приложению Б за указаниями по использованию данных рекомендаций в соответствии с требованиями стандарта IEEE/EIA 12207.1-1997.

(Опущен весьма объемистый список лиц, которым документ обязан своим появлением на свет).


1. Обзор


Данные рекомендации описывают рекомендованный подход к составлению спецификаций требований к программному обеспечению. Они делятся на 5 разделов.

  • Раздел 1 поясняет область применимости рекомендаций.
  • Раздел 2 перечисляет ссылки на другие стандарты.
  • В разделе 3 приведены определения основных используемых терминов.
  • Раздел 4 предоставляет дополнительную информацию по написанию хорошей SRS.
  • В разделе 5 обсуждаются все основные части SRS.

Данные рекомендации содержат также два приложения; в одном представлены альтернативные форматы шаблонов, в другом – указания по соответствию со стандартом IEEE/EIA   12207.1-1997.


1.1.   Область применимости


Данный документ представляет собой рекомендации по написанию спецификаций требований к программному обеспечению. Он описывает содержание и характеристики качественной спецификации требований к программному обеспечению (SRS) и представляет несколько примеров плана SRS.

Данные рекомендации ориентированы на специфицирование требований к разрабатываемому программному обеспечению, но могут также оказаться полезны при выборе самостоятельно разработанных и коммерческих продуктов. Однако их применение к уже разработанному программному обеспечению может отрицательно повлиять на продуктивность.

Если программное обеспечение встроено в некоторую большую систему, например, медицинское оборудование, то могут возникнут проблемы, лежащие вне пределов применимости данных рекомендаций.

Данные рекомендации описывают процесс создания продукта и содержание продукта. Продуктом является SRS. Рекомендации могут быть непосредственно использованы для создания SRS или как модель для более специфического стандарта.

Данная рекомендация не предлагает никаких конкретных методов или инструментов для подготовки SRS.

...


Целиком можно прочитать у нас на сайте.

  • Программирование :: Технологии разработки программных систем
  • Доброе утро. Давно мучаюсь с такой проблемой.
    Есть класс - назовем его Сервер, к которому обращаются из разных потоков Клиенты.
    Необходимо спроектировать общение Клиента с Сервером таким образом, чтобы Сервер, получив запрос от одного Клиента, обработал его (в это время остальные Клиенты в своем потоке ждут очереди), и затем начал обрабатывать следуюшего Клиента и т.д.
    Пробовал в классе Сервер обарачивать тело каждого паблик метода в lock(this) {}. Но происходила "самоблокировка"
    Может потому, что эти методы вызывают друг друга?

    Слаб в вопросе многопоточности, это мой первый опыт с ней. Собственно вопрос: какое существует архитектурное решение? Что почитать по этому поводу? Классы клиентов будут расти, и соответственно не хотелось бы блокировку возлагать на них.

    Приаттачил схему, если это как-то поможет прояснить ситуацию.

    (http://forum.shelek.ru/index.php?action=dlattach;attach=5889)

    ЗЫ: обращения к серверу должны проходить синхронно. Важно, чтобы обрабатывался лишь один запрос единовременно.
  • Программирование :: С/С++
  • Доброго времени суток!
    Откликнитесь кто может: как скопировать из одной строки с позиции "X" и длинной "Y" в другую!

    Например, как:
    strncpy(строка_получатель, строка2_источник, число_длины);
    только "строка_получатель" должен получить текст не сначала строки.

    Спасибо заранее!
  • Подскажите, пожалуйста, есть переменная, например, int i=206. В 16-ти ричном формате этому числу соответствует CE. Как имея переменную i получить числа С и В отдельно (12 и 11)?
  • Инициализация OpenGL. Код:
    Код:
    #include <windows.h>

    #include <tchar.h> // Для макроса _T

    // Подключаем библиотеки OpenGL
    #include <gl\gl.h>    // OpenGL32
    #include <gl\glu.h>   // GLu32
    //#include <gl\glaux.h> // GLaux

    // Прототипы функций
    LRESULT  CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
    GLvoid ReSizeGLScene( GLsizei, GLsizei );
    int InitGL( GLvoid );
    int DrawGLScene( GLvoid );
    GLvoid KillGLWindow( GLvoid );
    BOOL CreateGLWindow( LPCWSTR title, int width, int height, int bits, bool fullscreenflag );

    namespace { // Глобальные переменные
        const int screenw = 1024,
                  screenh = 768;
        HGLRC hRC = NULL;       // Постоянный контекст рендеринга
        HDC hDC = NULL;         // Приватный контекст устройства GDI
        HWND hWnd = NULL;       // Здесь будет хранится дескриптор окна
        HINSTANCE hInstance;    // Здесь будет хранится дескриптор приложения
        bool keys[256];         // Массив, используемый для операций с клавиатурой
        bool active = true;     // Флаг активности окна, установленный в true по умолчанию
        bool fullscreen = true; // Флаг режима окна, установленный в полноэкранный по умолчанию
    }

    int WINAPI WinMain( HINSTANCE hInstance, // Дескриптор приложения
        HINSTANCE hPrevInstance,             // Дескриптор родительского приложения
        LPSTR lpCmdLine,                     // Параметры командной строки
        int nCmdShow )                       // Состояние отображения окна
    {
        MSG  msg;          // Структура для хранения сообщения Windows
        BOOL done = false; // Логическая переменная для выхода из цикла
       
        // Спрашивает пользователя, какой режим экрана он предпочитает
        if( MessageBox( NULL, "Хотите ли Вы запустить приложение в полноэкранном режиме?",
                "Запустить в полноэкранном режиме?", MB_YESNO | MB_ICONQUESTION) == IDNO )
        {
            fullscreen = false; // Переключаем переменную fullscreen в оконный режим
        }
       
        // Создать наше OpenGL окно
        if( !CreateGLWindow( (WCHAR*) "OpenGL", screenw, screenh, 32, fullscreen ) )
        {
            return 0; // Выйти, если окно не может быть создано
        }

        while( !done ) // Цикл продолжается, пока done не равно true
        {
            if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) // Есть ли в очереди какое-нибудь сообщение?
            {
                if( msg.message == WM_QUIT ) // Мы поучили сообщение о выходе?
                {
                    PostQuitMessage( 0 ); // В учебнике вызвана не была, но описывалась
                    done = true; // Если так, done=true
                }
                else // Если нет, обрабатывает сообщения
                {
                    TranslateMessage( &msg ); // Переводим сообщение
                    DispatchMessage( &msg );  // Отсылаем сообщение
                }
            }
            else // Если нет сообщений
            {
                // Прорисовываем сцену.
                if( active )          // Активна ли программа?
                {
                    if(keys[VK_ESCAPE]) // Было ли нажата клавиша ESC?
                    {
                        done = true;    // ESC говорит об останове выполнения программы
                    }
                    else                // Не время для выхода, обновим экран.
                    {
                        DrawGLScene();      // Рисуем сцену
                        SwapBuffers( hDC ); // Меняем буфер (двойная буферизация)
                    }
                }
                // Меняем полноэкранный режим на экранный если нажато F11
                if( keys[VK_F11] ) // Была ли нажата F11?
                {
                    keys[VK_F11] = false;      // Если так, меняем значение ячейки массива на false
                    KillGLWindow();           // Разрушаем текущее окно
                    fullscreen = !fullscreen; // Переключаем режим
                    // Пересоздаём наше OpenGL окно
                    if( !CreateGLWindow( (WCHAR*) _T("OpenGL"), screenw, screenh, 32, fullscreen ) )
                    {
                        return 0; // Выходим, если это невозможно
                    }
                }
            }
        }
        // done = false - завершаем работу приложения (корректно уничтожаем GL-окно)
        KillGLWindow();                // Разрушаем окно
        return ( msg.wParam );              // Выходим из программы
    }

    LRESULT CALLBACK WndProc( HWND  hWnd, // Дескриптор нужного окна
        UINT  uMsg,     // Сообщение для этого окна
        WPARAM  wParam, // Дополнительная информация
        LPARAM  lParam) // Дополнительная информация
    {
        switch ( uMsg ) // Проверка сообщения для окна
        {
            case WM_ACTIVATE:           // Проверка сообщения активности окна
            {
                if( !HIWORD( wParam ) ) // Проверить состояние минимизации
                {
                    active = true;      // Программа активна
                }
                else
                {
                    active = false;     // Программа теперь не активна
                }
                return 0;               // Возвращаемся в цикл обработки сообщений
            }
            case WM_SYSCOMMAND:           // Перехватываем системную команду
            {
                switch ( wParam )         // Останавливаем системный вызов
                {
                    case SC_SCREENSAVE:   // Пытается ли запустится скринсейвер?
                    case SC_MONITORPOWER: // Пытается ли монитор перейти в режим сбережения энергии?
                    return 0;             // Предотвращаем это
                }
                break; // Выход
            }
            case WM_CLOSE:            // Мы получили сообщение о закрытие?
            {
                PostQuitMessage( 0 ); // Отправить сообщение о выходе
                return 0;             // Вернуться назад
            }
            case WM_KEYDOWN:         // Была ли нажата кнопка?
            {
                keys[wParam] = true; // Если так, мы присваиваем этой ячейке true
                return 0;            // Возвращаемся
            }
            case WM_KEYUP:            // Была ли отпущена клавиша?
            {
                keys[wParam] = false; //  Если так, мы присваиваем этой ячейке false
                return 0;             // Возвращаемся
            }
            case WM_SIZE:                                        // Изменены размеры OpenGL окна
            {
                ReSizeGLScene( LOWORD(lParam), HIWORD(lParam) ); // Младшее слово=Width, старшее слово=Height
                return 0;                                        // Возвращаемся
            }
        }
       
        // Пересылаем все необработанные сообщения DefWindowProc
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }

    GLvoid ReSizeGLScene( GLsizei width, GLsizei height ) // Изменить размер и инициализировать окно GL
    {
        if( height == 0 )                   // Предотвращение деления на ноль
        {
            height = 1;
        }
        glViewport( 0, 0, width, height );  // Сброс текущей области вывода
       
        glMatrixMode( GL_PROJECTION );      // Выбор матрицы проекций
        glLoadIdentity();                   // Сброс матрицы проекции
       
        // Вычисление соотношения геометрических размеров для окна
        gluPerspective( 45.0f, (GLfloat) width / (GLfloat) height, 0.1f, 100.0f );
       
        glMatrixMode( GL_MODELVIEW );       // Выбор матрицы вида модели
        glLoadIdentity();                   // Сброс матрицы вида модели
    }

    int InitGL( GLvoid ) // Все установки касаемо OpenGL происходят здесь
    {
        glShadeModel( GL_SMOOTH );              // Разрешить плавное цветовое сглаживание
       
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // Очистка экрана в черный цвет
       
        glClearDepth( 1.0f );                   // Разрешить очистку буфера глубины
        glEnable( GL_DEPTH_TEST );              // Разрешить тест глубины
        glDepthFunc( GL_LEQUAL );               // Тип теста глубины
       
        glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); // Улучшение в вычислении перспективы
       
        return true; // Инициализация прошла успешно
    }

    int DrawGLScene( GLvoid ) // Здесь будет происходить вся прорисовка
    {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Очистить экран и буфер глубины
        glLoadIdentity(); // Сбросить текущую матрицу
       
        /* Вставка для рисования */

        return true; // Прорисовка прошла успешно
    }

    GLvoid KillGLWindow( GLvoid ) // Корректное разрушение окна
    {
        if( fullscreen )                        // Мы в полноэкранном режиме?
        {
            ChangeDisplaySettings( NULL, 0 );   // Если да, то переключаемся обратно в оконный режим
            ShowCursor( true );                 // Показать курсор мышки
        }

        if( hRC )                               // Существует ли Контекст Рендеринга?
        {
            if( !wglMakeCurrent( NULL, NULL ) ) // Возможно ли освободить RC и DC?
            {
                MessageBox( NULL, "Release Of DC And RC Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
            }
            if( !wglDeleteContext( hRC ) )      // Возможно ли удалить RC?
            {
                MessageBox( NULL, "Release Rendering Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
            }
            hRC = NULL;                         // Установить RC в NULL
        }
       
        if( hDC && !ReleaseDC( hWnd, hDC ) )    // Возможно ли уничтожить DC?
        {
            MessageBox( NULL, "Release Device Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
            hDC=NULL;                           // Установить DC в NULL
        }
       
        if(hWnd && !DestroyWindow(hWnd))        // Возможно ли уничтожить окно?
        {
            MessageBox( NULL, "Could Not Release hWnd.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
            hWnd = NULL;                        // Установить hWnd в NULL
        }
       
        if( !UnregisterClass( "OpenGL", hInstance ) ) // Возможно ли разрегистрировать класс
        {
            MessageBox( NULL, "Could Not Unregister Class.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
            hInstance = NULL;                   // Установить hInstance в NULL
        }
    }

    BOOL CreateGLWindow( LPCWSTR title, int width, int height, int bits, bool fullscreenflag )
    {
        GLuint PixelFormat; // Хранит результат после поиска
       
        WNDCLASS wc;        // Структура класса окна
       
        DWORD dwExStyle;    // Расширенный стиль окна
        DWORD dwStyle;      // Обычный стиль окна
       
        RECT WindowRect;                    // Grabs Rectangle Upper Left / Lower Right Values
        WindowRect.left = (long) 0;         // Установить левую составляющую в 0
        WindowRect.right = (long) width;    // Установить правую составляющую в Width
        WindowRect.top = (long) 0;          // Установить верхнюю составляющую в 0
        WindowRect.bottom = (long) height;  // Установить нижнюю составляющую в Height
       
        fullscreen = fullscreenflag; // Устанавливаем значение глобальной переменной fullscreen
       
        hInstance        = GetModuleHandle( NULL );             // Считаем дескриптор нашего приложения
        wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;  // Перерисуем при перемещении и создаём скрытый DC
        wc.lpfnWndProc   = (WNDPROC) WndProc;                   // Процедура обработки сообщений
        wc.cbClsExtra    = 0;                                   // Нет дополнительной информации для окна
        wc.cbWndExtra    = 0;                                   // Нет дополнительной информации для окна
        wc.hInstance     = hInstance;                           // Устанавливаем дескриптор
        wc.hIcon         = LoadIcon( NULL, IDI_WINLOGO );       // Загружаем иконку по умолчанию
        wc.hCursor       = LoadCursor( NULL, IDC_ARROW );       // Загружаем указатель мышки
        wc.hbrBackground = NULL;                                // Фон не требуется для GL
        wc.lpszMenuName  = NULL;                                // Меню в окне не будет
        wc.lpszClassName = "OpenGL";                            // Устанавливаем имя классу

        if( !RegisterClass( &wc ) ) // Пытаемся зарегистрировать класс окна
        {
            MessageBox( NULL, "Failed To Register The Window Class.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
            return false; // Выход и возвращение функцией значения false
        }

        if( fullscreen ) // Полноэкранный режим?
        {
            DEVMODE dmScreenSettings; // Режим устройства
            memset( &dmScreenSettings, 0, sizeof( dmScreenSettings ) ); // Очистка для хранения установок
            dmScreenSettings.dmSize = sizeof( dmScreenSettings ); // Размер структуры Devmode
            dmScreenSettings.dmPelsWidth = width; // Ширина экрана
            dmScreenSettings.dmPelsHeight = height; // Высота экрана
            dmScreenSettings.dmBitsPerPel = bits; // Глубина цвета
            dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; // Режим Пикселя
           
            // Пытаемся установить выбранный режим и получить результат.  Примечание: CDS_FULLSCREEN убирает панель управления.
            if( ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
            {
                // Если переключение в полноэкранный режим невозможно, будет предложено два варианта: оконный режим или выход.
                if( MessageBox( NULL, "The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",
                    "OpenGL", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES )
                {
                    fullscreen = false; // Выбор оконного режима (fullscreen = false)
                }
                else
                {
                    // Выскакивающее окно, сообщающее пользователю о закрытие окна.
                    MessageBox( NULL, "Program Will Now Close.", "ERROR", MB_OK | MB_ICONSTOP );
                    return false; // Выход и возвращение функцией false
                }
            }
        }
       
        if(fullscreen) // Мы остались в полноэкранном режиме?
        {
            dwExstyle="WS_EX_APPWINDOW;" // Расширенный стиль окна
            dwstyle="WS_POPUP; "         // Обычный стиль окна
            ShowCursor( false );         // Скрыть указатель мышки
        }
        else
        {
            dwExstyle="WS_EX_APPWINDOW" | WS_EX_WINDOWEDGE; // Расширенный стиль окна
            dwStyle   = WS_OVERLAPPEDWINDOW;                // Обычный стиль окна
        }

        AdjustWindowRectEx( &WindowRect, dwStyle, false, dwExStyle ); // Подбирает окну подходящие размеры (на полноэкранный режым не влияет)

        if( !( hWnd = CreateWindowEx(
                    dwExStyle,                        // Расширенный стиль для окна
                    _T("OpenGL"),                     // Имя класса (такое же как при регистрации)
                    (CHAR*) title,                    // Заголовок окна
                    WS_CLIPSIBLINGS |                 // Требуемый стиль для окна
                    WS_CLIPCHILDREN |                 // Требуемый стиль для окна
                    dwStyle,                          // Выбираемые стили для окна
                    0, 0,                             // Позиция окна
                    WindowRect.right-WindowRect.left, // Вычисление подходящей ширины
                    WindowRect.bottom-WindowRect.top, // Вычисление подходящей высоты
                    NULL,                             // Нет родительского окна
                    NULL,                             // Нет меню
                    hInstance,                        // Дескриптор приложения
                    NULL ) ) )                        // Не передаём ничего до WM_CREATE (???)
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, "Window Creation Error.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
            return false; // Вернуть false
        }

        static  PIXELFORMATDESCRIPTOR pfd = // pfd сообщает Windows каким будет вывод на экран каждого пикселя
        {
            sizeof( PIXELFORMATDESCRIPTOR ), // Размер дескриптора данного формата пикселей
            1,                   // Номер версии
            PFD_DRAW_TO_WINDOW | // Формат для Окна
            PFD_SUPPORT_OPENGL | // Формат для OpenGL
            PFD_DOUBLEBUFFER,    // Формат для двойного буфера
            PFD_TYPE_RGBA,       // Требуется RGBA формат
            bits,                // Выбирается бит глубины цвета
            0, 0, 0, 0, 0, 0,    // Игнорирование цветовых битов
            0,                   // Нет буфера прозрачности
            0,                   // Сдвиговый бит игнорируется
            0,                   // Нет буфера накопления
            0, 0, 0, 0,          // Биты накопления игнорируются
            32,                  // 32 битный Z-буфер (буфер глубины)
            0,                   // Нет буфера трафарета
            0,                   // Нет вспомогательных буферов
            PFD_MAIN_PLANE,      // Главный слой рисования
            0,                   // Зарезервировано
            0, 0, 0              // Маски слоя игнорируются
        };

        if( !( hDC = GetDC( hWnd ) ) ) // Можем ли мы получить Контекст Устройства?
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, "Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
            return false;   // Вернуть false
        }

        if( !( PixelFormat = ChoosePixelFormat( hDC, &pfd ) ) ) // Найден ли подходящий формат пикселя?
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, "Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
            return false;   // Вернуть false
        }

        if( !SetPixelFormat( hDC, PixelFormat, &pfd ) ) // Возможно ли установить Формат Пикселя?
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, "Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
            return false;   // Вернуть false
        }

        if( !( hRC = wglCreateContext( hDC ) ) ) // Возможно ли установить Контекст Рендеринга?
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, "Can't Create A GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
            return false;   // Вернуть false
        }

        if( !wglMakeCurrent( hDC, hRC ) ) // Попробовать активировать Контекст Рендеринга
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, "Can't Activate The GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
            return false;   // Вернуть false
        }

        ShowWindow( hWnd, SW_SHOW );    // Показать окно
        SetForegroundWindow( hWnd );    // Слегка повысим приоритет
        SetFocus( hWnd );               // Установить фокус клавиатуры на наше окно
        ReSizeGLScene( width, height ); // Настроим перспективу для нашего OpenGL экрана.

        if( !InitGL() ) // Инициализация только что созданного окна
        {
            KillGLWindow(); // Восстановить экран
            MessageBox( NULL, _T("Initialization Failed."), _T("ERROR"), MB_OK | MB_ICONEXCLAMATION );
            return false;   // Вернуть false
        }

        return true; // Всё в порядке!
    }

  • Доброго времени суток  :)

    Подскажите, пожалуйста, кто-нибудь собирал net-smnp под windows?
    Скачиваю дистрибутив отсюда: http://www.net-snmp.org/download.html
    Компилю в vs2008, все отлично компитился.

    Пытаюсь сделать пример: http://www.net-snmp.org/wiki/index.php/TUT:Simple_Application

    библиотеки естественно подключаю, вылазит ошибка: "unresolved external symbol" на вызов функции init_snmp("snmpapp");

    библиотеки подключаю, как
    #pragma comment(lib,"netsnmp.lib")
    #pragma comment(lib,"netsnmpmibs.lib")
    #pragma comment(lib,"netsnmptrapd.lib")

    Буду рада любой помощи  :shuffle:
  • Хочу для программы занять достаточно большой объём памяти:
    unsigned short data_table[3][5000000];
    Это получается грубо 3 х 5 Мбайт = 15 Мбайт
    В процессе выполнения возникает ошибка доступа:
    Unhandled exception in мой_экзе_файл: адрес_памяти: Access Violation
    Существуют какие-то ограничения на объём резервируемой памяти для программы?
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Уважаемые, подскажите ЕСЛИ кто сталкивался.

    Есть набор клиент-серверных приложений собственной разработки. Для связи используются сокеты в виде  классов в которых реализовна и клиентская и серверная части. Вся часть ПО ответственная за связь вынесена в отдельную DLL.

    Сервер запускается, клиенты к нему подключаются, отключаются и т.д. и т.п.
    Все нормально работало неделями - дольше не получалось тестировать непрерывно - приходилось перезапускать.
    Клиентов было штук 20.

    Сейчас клиентов увеличил до 150. Теперь все работает но 2,5 дня. Может и дольше - до недели, но не меньше точно.
    Потом происходит следующая ситуация. Сервер видит подключения клиентов, новые подключаются, старые отключаются, но данные не пересылаются ни в одну сторону.

    Была идея - сделать перезапуск класса сервера, отвечающего за связь. Обнаружил интересную штуку - если сделать этот перезапуск искусственно - скажем через 1 сутки - все нормально работает. Но если дождаться когда связь "отвалится" сама - увы, клиенты подключаются, а данные не ходят ни в одну сторону.

    Перезапускаешь приложение - все опять работает.
    Понятно, что где-то что-то переполняется, но вот что и где????

    Идеи есть какие-нибудь?
    Спасибо.
  • Программирование :: Delphi
  • Товарищи, а не знаете ли, как возможно организовать "тихую" печать отчета FreeReport? То есть, чтобы не выскакивало окошко с настройками принтера, количества копий, и т.д., а отчет отправлялся сразу на принтер. Все настройки принтера, которые (не)нужны пользователю уже сделаны в отчете...
  • Добрый день.
    Я хотел бы узнать, возможно ли обрабатывать ошибки ответа сервера, 404 например, 403 и т.д. и использовать их в программе?
    пользуюсь twebbrowser
    нужно проверить есть картинка на сервере или нет, т.е. если ответ сервера HTTP/1.1 404 Not Found, то одно действие, если картинку обнаруживает, то другое. (пока мне прога выдаёт ошибку и останавливается, пока не нажму на появившемся с ошибкой окне кнопку "ОК")

    я новичок с делфи, если кто знает решение - помогите пожалуйста.
  • доброго времени суток!!столкнулся с проблемой русского языка при post запросе используя tidmultipartformdatastream!!формиру ю вот так:

    Код:

     multi.AddFormField ('orfo','Русский язык');
     multi.AddFormField ('Tags','');
     multi.AddFormField ('MoodText','');
     multi.AddFormField ('MoodID','0');

    а когда поститься то вместо надписи "русский язык" - получаю кракозяблы
     а если http.HTTPOptions:=[] установить по получаю кучу вопросиков вместо сиволов!

     сервер работает в windows-1251!
     никто не сталкивался с такой проблемой???

  • Программирование :: Ассемблер
  • Есть программа на FASM, в которой 2 секции кода, причём в каждой секции прописаны переменные. Как структуру такой программы можно перевести на MASM 32? В MASMе не допускается же в секции кода чередование команд и данных. При создании для MASM общей для всех  переменных секции .data программа компилируется, но при запуске выскакивает окно, что обнаружена ошибка и приложение будет закрыто. Что делать, подскажите.
    Вот упрощённая структура программы:

    format PE GUI 4.0
    entry start
    section '.A' code executable readable writeable
      ; Код секции A
      ; Данные типа A dd 0

    section '.AAA' code executable readable writeable
      ; Данные типа AAA dd 0
    start:
      ; Код секции AAA
    invoke ExitProcess, 0
  • Программирование :: Программирование 1С
  • Добрый день уважаемые Гуру.
    Не получается сделать корректно отчет.

    Исходные данные:
    Регистр накопления
    Измерения: Дата, Склад, Номенклатура
    Ресурсы: Количество

    Создаю макет отчета в итоге получаю запрос:
     
    Код:
    ВЫБРАТЬ
    РегистрНакопленияОстаткиИОбороты.Дата КАК Дата,
    РегистрНакопленияОстаткиИОбороты.Склад КАК Склад,
    РегистрНакопленияОстаткиИОбороты.Номенклатура КАК Номенклатура,
    РегистрНакопленияОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
    РегистрНакопленияОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
    РегистрНакопленияОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
    РегистрНакопленияОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
    ИЗ
    РегистрНакопления.РегистрНакопления.ОстаткиИОбороты КАК РегистрНакопленияОстаткиИОбороты

    СГРУППИРОВАТЬ ПО
    РегистрНакопленияОстаткиИОбороты.Склад,
    РегистрНакопленияОстаткиИОбороты.Дата,
    РегистрНакопленияОстаткиИОбороты.Номенклатура,
    РегистрНакопленияОстаткиИОбороты.КоличествоНачальныйОстаток,
    РегистрНакопленияОстаткиИОбороты.КоличествоПриход,
    РегистрНакопленияОстаткиИОбороты.КоличествоРасход,
    РегистрНакопленияОстаткиИОбороты.КоличествоКонечныйОстаток

    УПОРЯДОЧИТЬ ПО
    Дата,
    Склад,
    Номенклатура,
    КоличествоНачальныйОстаток,
    КоличествоПриход,
    КоличествоРасход,
    КоличествоКонечныйОстаток

    в результате окно отчета получается как в вложенном файле window.jpg

    Вопросы:

    1. Почему колонка начальный остаток везде пустая ? (надо чтобы брался конечный остаток с предыдущей записи этого склада и этой номенклатуры)
    2. При расходе соответственно в колонке Конечный остаток показывалась разница Начального остатка и Расхода.
    3. Необходимо в запрос отчета ввести данные выборки (выборка берется из формы отчета), чтобы пользователь мог выбирать просмотр отчета по Дате, Складу, Номенклатуре.

    Буду рад любой помощи, в т.ч и платной, может кто сможет помочь в Ростове-на-Дону (приеду угощу пивом/рыбой/деньгами)

    Ответы присылайте в личку а также на почту spymap@mail.ru. Спасибо
  • Программирование :: Программирование 1С :: 1С 7.x
  • База перенесена на вин2008сер с 2003. На 2003 пакетный режим тестирование/исправление БД проходит на ура.
    На 2008 при запуске пакетного режима конфигуратор выдает ошибку - "Отсутствует словарь данных"
    Файл ДД естественно есть.
    В ручном режиме тестирование/исправление проходит норм.

    и в догонку...
    объединил рабочую БД из разработачной.
    добавил в журналы доков Общий и еще пару журналов  колонку "Автор" (общий реквизит документов)
    на девелопной базе под 2003 колонка отображается в режиме предприятия, в 2008 (рабочей) - нет, хотя в конфигураторе она присутствует...
    тестирование/исправление полностью сделано..
  • Программирование :: Программирование 1С :: 1С 8.x
  • Здравствуйте!
    Подскажите пожалуйста как в надпись "СуммаДокумента" вывести сумму из подвала таблицы?

    (http://s001.radikal.ru/i194/1104/88/e982781e7c39.jpg)

    Добавлено через 9 минут и 55 секунд:
    Тут считается просто сумма = цена * количество.
     Что дописать, чтобы плюсовалась сумма следующей строки?

     СуммаДокумента = (СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество) + ... ;
  • Добрый день!

    после обновления 1С УПП с версии 1.3.6.2 на версию 1.3.7.2, в режиме 1С:Предприятие "Изменился номер версии конфигурации. Будет выполнено обновление информационной базы", жму "ОК", подтверждаю легальность получения обновлений и вылазит сообщение "Не выполнено обновление информационной базы! Завершить работу системы?" "Да, Нет", а в Служебные сообщения пишет:
    Код:
     ! "Регламентированный учет: Обновление справочника "Регламентированные отчеты".
    !! Обновление информационной базы не выполнено."

    кто нибудь сталкивался с данной проблемой?
  • Добрый день! 1С штатно использует во всех отчетах (макетах) шрифт Arial. Интересует возможность поменять такой шрифт на другой. Возможно ли это сделать как-то централизовано, не исправляя каждый документ отдельно?
    Заранее спасибо!
  • Направления программирования :: Drivers
  • Стоит задача определить время загрузки Windows, в том числе всех драйверов.
    Ставлю загрузку своего драйвера самым первым (проверяю этот факт через программу LoadOrder [http://technet.microsoft.com/en-us/sysinternals/bb897416]),
    потом пробую перехватить загрузку драйверов через CallBack функцию установленную через PsSetLoadImageNotifyRoutine.
    Проблема в том что в перехватчик, установленный через PsSetLoadImageNotifyRoutine попадают только драйвера с флагом загрузки =1(SERVICE_SYSTEM_START),
    а с флагом 0(SERVICE_BOOT_START) не отлавливаются! :(
    Хотелось бы перехватить запуск всех драйверов, начиная с sptd.sys и acpi.sys, может есть ещё какие-нибудь способы?

    P.S. Перехват NtLoadDriver через SST нежелателен, если вообще возможен на первоначальном этапе загрузки ОС.
  • Здравствуйте, форумчане)
    Может кто работал с RTX?
    При работе возникла проблема. Если собрать exe-шник, то все нормально:  хэндл при атаче не нулевой, реакция есть.
    Собираю rtss и начинаются чудеса. хэндл при атаче не нулевой (!!!!), а реакции нету.  Код для работы с plx9054 и там и там одинаковый(
    Плата точно рабочая.
    [expand=(тута код)]
    #if UNDER_RTSS
       if(!RtQueryPciMsiCapability(busNumber[0], slotNumber[0]))
       {
          //сюда и попадаем если rtss
          AttachParams0.AttachVersion = ATTACH_LINE_BASED;             // Line based version
          AttachParams0.LineBased.pThreadAttributes = NULL;            // Security attributes (default)
          AttachParams0.LineBased.StackSize = 0;                       // Use default value
          AttachParams0.LineBased.pRoutine = DeviceIST0;      // IST
          AttachParams0.LineBased.Context = NULL;                  // Context passed to IST and ISR
          AttachParams0.LineBased.Priority = IST_PRIORITY;            // IST priority
          AttachParams0.LineBased.InterfaceType = PCIBus;              // PCI bus
          AttachParams0.LineBased.BusNumber = busNumber[0];            // Bus number
          AttachParams0.LineBased.SlotNumber = slotNumber[0];            // Slot number
          AttachParams0.LineBased.BusInterruptLevel = irqLevel[0];      // Interrupt level
          AttachParams0.LineBased.BusInterruptVector = irqVector[0];      // Interrupt vector
          AttachParams0.LineBased.Shared = bShared;                      // Not shared
          AttachParams0.LineBased.InterruptMode = LevelSensitive;      // Type of interrupt
          AttachParams0.LineBased.MyInterrupt =DeviceISR0;            // ISR
          AttachParams0.LineBased.ProcessorEnableMask = 1 << RtGetCurrentProcessorNumber();   // Rtss Processor Mask
       }
       else
       {
          RtPrintf("4\n");
          AttachParams0.AttachVersion = ATTACH_MESSAGE_BASED;            // Message based version
          AttachParams0.MessageBased.pThreadAttributes = NULL;            // Security attributes (default)
          AttachParams0.MessageBased.StackSize = 0;                  // Use default value
          AttachParams0.MessageBased.pRoutine = DeviceIST0;         // IST
          AttachParams0.MessageBased.Context = NULL;                  // Context passed to IST and ISR
          AttachParams0.MessageBased.Priority = IST_PRIORITY;            // IST priority
          AttachParams0.MessageBased.BusNumber = busNumber[0];            // Bus number
          AttachParams0.MessageBased.SlotNumber = slotNumber[0];            // Slot number
          AttachParams0.MessageBased.MyInterrupt = DeviceISR0;            // ISR
          AttachParams0.MessageBased.ProcessorEnableMask = 1 << RtGetCurrentProcessorNumber();   // Rtss Processor Mask
       }

       // Attach interrupt
       RtPrintf("5\n");
       intHandler[0] = RtAttachInterrupt(&AttachParams0);//не нулевой
    //   RtEnableInterrupts();
       RtPrintf("6\n");
    #else
                 //сюда в exe попадаем
       intHandler[0] = RtAttachInterruptVectorEx (
                      NULL,           // security attributes (default)
                            0,              // stack size (default)
                            DeviceIST0,      // pointer to Interrupt Service Thread (IST).
                            NULL,           // context argument
                            IST_PRIORITY,   // thread priority for the handler routine
                            PCIBus,         // interface type
                            busNumber[0],      // bus number
                            irqLevel[0],       // interrupt level
                            irqVector[0],      // interrupt vector
                            bShared,        // prepared to share the interrupt vector
                            LevelSensitive,   // interrupt Mode
                            DeviceISR0      // pointer to Interrupt Service Routine (ISR)
                      );//хэндл так же н нулевой
    #endif
    [/expand]
    Подскажите, пожалуйста, что не так(
  • Практические разделы :: Железо
  • может кто знает, почему они работают на писюках (и под XP, и под семёркой, на других системах не проверял ), но на ноутбуках возникают разные проблемы - на одном ноуте вообще как модем железяка не определяется, только как флешка, на другом ноуте работает до первой перезагрузки, а потом опять-таки железяка перестаёт маячить, пока не переустановишь прилагаемую программу

    конкретно пациент - ZTE E150
    Прошивку обновил с офсайта. Опсос - билайн (Но ещё такая же фигня была с другим ZTE, зашитым под МТС)
  • В только что установленной WinXP SP3 не видны четыре "диска", представляющие разъемы карт памяти в кард-ридере. Если воткнуть флэшку в USB-разъем кард-ридера, то виндой она обнаруживается. Вставленная карта памяти от сотового (через переходник; работал в прошлой винде) - не видится. При загрузке с LiveCD - четыре "диска" видны. В чем проблема?
    Драйвера на материнку ставил с компактов, прилагавшихся к системнику в магазине.
  • Практические разделы :: Программы
  • Речь тут будет касаться японской игры, которую я захотел перевести на русский язык. Так как тут больше связанно с программами, а не с сомой игрой я решил в этом разделе задать вопрос.

    Мои действия:
    1. Монтировал образ с игрой с помощью программы daemon tools.
    2. Скопировал игру на жёсткий диск и проверил, что она устанавливается и запускается.
    Внешний вид первого окна такой (Прикреплённый файл win1.jpg)
    3. Открыл исполняемый файл в программе Restorator (Прикреплённый файл win2.jpg)
    Меня сразу насторожил тот факт, что рамка вокруг картинки больше самой картинки, хотя я ни каких действий ещё не делал.
    Параметры окна:
    Окно: Слева: 0, Сверху: 0, Ширина: 243, Высота: 307
    Картинка:  Слева: 7, Сверху: 7, Ширина: 229, Высота: 200
    Поле для картинки: Слева: 6, Сверху: 7, Ширина: 229, Высота: 200
    Левая кнопка: Слева: 12, Сверху: 270, Ширина: 70, Высота: 23
    Центральная кнопка: Слева: 94, Сверху: 270, Ширина: 66, Высота: 22
    Правая кнопка: Слева: 174, Сверху: 270, Ширина: 62, Высота: 23
    4. Изменил текст у заголовка окна и у кнопок, а также на всякий случай проверил все параметры окна они остались такими же.
    5. Сделал patch.
    6. А в результате в место нужного результата такой (Прикреплённый файл win3.jpg) - Куда то пропали три кнопки, методом изменений размера картинки я смог понять, что три кнопки скрылись по картинкой.

    Почему так произошло, ведь я ни какие размеры окна не трогал?

    Я подумал может программа Restorator с глюком и проверил с помощью программы Resource Tuner результат такой же.

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное