Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Почему не отображается.. 
V
    Опции темы
S.A.G.
Дата 22.10.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Код
/*Операторы препроцессора*/
#include <windows.h> //два файла с определениями, макросами
#include <windowsx.h> //и прототипами функций Windows
#include "resource.h"
/*Прототипы используемых в программе функций пользователя*/

/*Обработка сообщений главного окна*/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //оконная функция
void OnPaint(HWND);
void OnCommand(HWND, int, HWND, UINT);
void OnDestroy(HWND); //прототип функции OnDestroy

/*Общая функция для всех порожденных потоков*/
DWORD WINAPI Thread(LPVOID);

/*Обработка сообщений окон порожденных потоков*/
LRESULT CALLBACK ThreadWndProc(HWND, UINT, WPARAM, LPARAM);
void ThreadOnPaint(HWND);
void ThreadOnDestroy(HWND);

/*Глобальные переменные*/
char szClassName[] = "MainWindow"; //произвольное имя класса главного окна
char szTitle[] = "Программа 12-3"; //произвольный заголовок окна

char szThreadClassName[] = "Thread"; //Имя класса окна порождаемых потоков
char szThreadTitle[] = "Дочерний поток"; //Заголовок окон потоков

HINSTANCE hInstance; //Дескриптор экземпляра приложения
HANDLE hThread; //Дескриптор создаваемого потока
DWORD dwIDThread; //Идентификатор создаваемого потока
int nCount; //Счетчик потоков
/*Главная функция WinMain*/
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    MSG Msg; //структура Msg типа MSG для получения сообщений Windows
    WNDCLASS wc; //структура wc типа WNDCLASS для задания характеристик окна

    hInstance = hInst; //Сохраним дескриптор экземпляра приложения

    /*Зарегестрируем класс главного окна*/
    ZeroMemory(&wc, sizeof(wc)); //Обнуление всех членов структуры wc
    
    wc.lpfnWndProc = WndProc; //Определяем оконную процедуру для главного окна
    wc.hInstance = hInst; //Дескриптор приложения
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Стандартная пиктограмма
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); //Стандартный курсор мыши
    wc.hbrBackground = GetStockBrush(WHITE_BRUSH); //Светло-серый фон окна
    wc.lpszClassName = szClassName; //Имя класса окна
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);

    RegisterClass(&wc); //Вызов функции Windows регистрации класса окна
    
    /*Зарегестрируем класс окна порожденного потока*/
    wc.lpfnWndProc = ThreadWndProc; //Общая оконная функция всех потоков
    wc.lpszMenuName = NULL; //Меню у потоков небудет
    wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH); //Цвет окон светло-серый
    wc.lpszClassName = szThreadClassName; //Имя класса окон потоков
    wc.cbWndExtra = 16; //Для номера потока и времени запуска
    
    RegisterClass(&wc); //Регистрируем класс окон порожденных потоков
    
    /*Создадим главное окно и сделаем его видимым*/
    HWND hwnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 300, 100,
                             HWND_DESKTOP, NULL, hInst, NULL);
    
    ShowWindow(hwnd, SW_SHOWNORMAL); //Вызов функции Windows показа окна
    
    /*Организуем цикл обнаружения сообщений*/
        while (GetMessage(&Msg, NULL, 0, 0)) //Если есть сообщение, передать его нам
            DispatchMessage(&Msg); //и вызвать оконную процедуру WndProc
    return 0; //После выхода из цикла вернуться в Windows
}
/*Оконная функция WndProc главного окна (первичного потока)*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) //Переход по значению Msg - номеру сообщения
    {
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
        HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
                         return 0;
        default           : return (DefWindowProc(hwnd, msg, wParam, lParam));
    }
}
/*Функция обработки сообщений WM_PAINT главного окна*/
void OnPaint(HWND hwnd)
{
    char szT[30];
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    
    wsprintf(szT, "Запущен поток #%d", nCount);
        if (hThread) //Если хоть один поток запущен
            TextOut(hdc, 160, 1, szT, strlen(szT)); //Вывести текст в главное окно
    EndPaint(hwnd, &ps);
}
/*Функция обработки сообщений WM_COMMAND для главного окна*/
void OnCommand(HWND hwnd, int id, HWND, UINT)
{
    switch(id)
    {
        case ID_40001: nCount++; //Счетчик потоков
                       hThread = CreateThread(NULL, 0, Thread, (LPVOID)nCount, 0,
                                              &dwIDThread);
                       CloseHandle(hThread); //Закрываем дескриптор потока
                       InvalidateRect(hwnd, NULL, TRUE); //Обновить главное окно
                       break;
        case ID_40002: DestroyWindow(hwnd);
    }
}
void OnDestroy(HWND)
{
    PostQuitMessage(0); //Вызов функции Windows завершения приложения
}
/*Общая для всех потоков рабочая функция потока*/
DWORD WINAPI Thread(LPVOID nCnt)
{
    MSG msg; //Структурная переменная для сообщений потоков
    SYSTEMTIME SysTime; //Структурная переменная для местного времени
    HWND hwnd = CreateWindowEx(WS_EX_TOPMOST, "Thread", //Создадим окно потока
                               "Порожденный поток", WS_OVERLAPPEDWINDOW, //Заголовок, стиль
                               nCount * 40 + 50, nCount * 60 + 15, 220, 100, //Сдвиг окон потоков
                               HWND_DESKTOP, NULL, hInstance, NULL);
    ShowWindow(hwnd, SW_NORMAL); //Покажем окно потока
    SetWindowLong(hwnd, 0, (LONG)nCnt); //Сохраним номер потока
    GetLocalTime(&SysTime); //Получим местное время
    SetWindowLong(hwnd, 4, (LONG)SysTime.wHour); //Сохраним часы
    SetWindowLong(hwnd, 8, (LONG)SysTime.wMinute); //Сохраним минуты
    SetWindowLong(hwnd, 12, (LONG)SysTime.wSecond); //Сохраним секунды
        while(GetMessage(&msg, NULL, 0, 0)); //Цикл обработки сообщений
            DispatchMessage(&msg); //Для окон всех потоков
    return 0;
}
/*Оконная процедура для окон потоков*/
LRESULT CALLBACK ThreadWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hwnd, WM_PAINT, ThreadOnPaint);
        HANDLE_MSG(hwnd, WM_DESTROY, ThreadOnDestroy);
        default: return(DefWindowProc(hwnd, msg, wParam, lParam));
    }
}
/*Функция обработки сообщений WM_PAINT для окон потоков*/
void ThreadOnPaint(HWND hwnd)
{
    char szT[100];
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);

    SetBkMode(hdc, TRANSPARENT); //Сделаем прозрачным фон символов
    wsprintf(szT, "Выполняется поток #%d", GetWindowLong(hwnd, 0)); //Заберем номер потока
    TextOut(hdc, 5, 1, szT, strlen(szT)); //Вывод строки
    wsprintf(szT, "Время запуска %d:%d:%d",
             GetWindowLong(hwnd, 4), //Заберем часы
             GetWindowLong(hwnd, 8), //Заберем минуты
             GetWindowLong(hwnd, 12)); //Заберем секунды
    TextOut(hdc, 5, 16, szT, strlen(szT)); //Вывод строки в окно
    EndPaint(hwnd, &ps);
}
/*Функция обработки сообщений WM_DESTROY для окон потоков*/
void ThreadOnDestroy(HWND)
{
    PostQuitMessage(0);
}

Почему в окнах порожденных потоков не отображается информация?
Причем каждое вновь созданное окно не реагирует должным образом на сообщения.

Это сообщение отредактировал(а) S.A.G. - 22.10.2007, 16:55


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
586
Дата 22.10.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(S.A.G. @  22.10.2007,  17:29 Найти цитируемый пост)
 while(GetMessage(&msg, NULL, 0, 0)); //Цикл обработки сообщений
            DispatchMessage(&msg); //Для окон всех потоков

PM   Вверх
S.A.G.
Дата 22.10.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



 smile Ламер, оно и есть ламер..


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
NiJazz
Дата 25.10.2007, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



S.A.G.,  smile 
Ну не внимателен оказался просто.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.