Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Mad_Programmer
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 25
1

Запуск функции в параллельном потоке

08.03.2018, 13:45. Просмотров 1060. Ответов 1
Метки нет (Все метки)

Пишу библиотеку работы с графикой на windows.h, для адекватной работы функции создания окна требуется запустить функцию с его созданием и обработкой сообщений в параллельном потоке. Вроде всё делаю как надо, но функция вылетает. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "windows.h"
#pragma comment (lib, "Gdi32.lib")
#include <stdio.h>
#include <process.h>
 
HWND Window = NULL;
 
struct WindowParam
    {
    const int width, height;
    const char* name;
    };
 
const char ClassName[] = "WindowAppClass";
 
LRESULT CALLBACK WndProc (HWND descriptor, UINT msg, WPARAM wParam, LPARAM lParam);
 
BOOL RegClass (WNDPROC, LPCSTR);
 
void txCreateWindowThreadProc (void *data);
 
HWND txCreateWindow (const int width, const int height, const char* name);
 
LRESULT CALLBACK WndProc (HWND descriptor, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch (msg)
        {
        case WM_DESTROY:
            {
            PostQuitMessage (0);
            printf ("Goodbye!\n");
            break;
            }
        }
 
    return DefWindowProc (descriptor, msg, wParam, lParam);
    }
 
BOOL RegClass (WNDPROC Proc, LPCTSTR szName)
    {
    WNDCLASS wc = {};
 
    HBRUSH hBR = CreateSolidBrush (RGB (0, 0, 0));
 
    wc.lpfnWndProc = Proc;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = hBR;                   //(HBRUSH) (brBackground + 1);
    wc.lpszClassName = szName;
 
    return (RegisterClass (&wc) != 0);
    }
 
HWND txCreateWindow (const int width, const int height, const char* name)
    {
    WindowParam data = {width, height, name};
 
    _beginthread (txCreateWindowThreadProc, 0, (void*) &data);
 
    return Window;
    }
 
void txCreateWindowThreadProc (void *data)
    {
    WindowParam *parameters = static_cast <WindowParam*> (data);
    MSG msg = {};
    HWND descriptor = {};
 
    if (Window != NULL)
        {
        printf ("The window has already been created!");
        }
 
    if (!RegClass (WndProc, ClassName))
        {
        printf ("Cannot register class!");
        }
 
    descriptor = CreateWindow (ClassName, (*parameters).name, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               (*parameters).width, (*parameters).height,
                               0, 0, NULL, NULL);
 
    Window = descriptor;
 
    if (!descriptor)
        {
        printf ("Cannot create a window!");
        }
 
    while (GetMessage (&msg, 0, 0, 0))
        {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
        }
    }
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2018, 13:45
Ответы с готовыми решениями:

Запуск метода класса в новом потоке
Здравствуйте, у меня есть класс, в нём функция - необходимо вызвать эту функцию в нескольких...

Запуск метода класса в отдельном потоке
Нужно запустить метод класса в отдельном потоке. Не могу понять, как реализовывать. Искал в инете...

Запуск приложения из-под консоли в отдельном потоке с записью времени запуска и закрытия в консоль
Добрый вечер, недавно начал изучать системное программирование, нашёл не особо много литературы и...

Постоянный вызов функции в произвольном потоке
Всем привет! Перед мной стоит следующая задача. У меня есть функция void Update(float time), и мне...

Выполняются ли callback функции в отдельном потоке (потоках)?
Или внутри функции DispatchMessage? Или есть несколько потоков для обработки...

1
Alex5
1125 / 784 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
08.03.2018, 15:04 2
Лучший ответ Сообщение было отмечено Mad_Programmer как решение

Решение

Цитата Сообщение от Mad_Programmer Посмотреть сообщение
_beginthread (txCreateWindowThreadProc, 0, (void*) &data);
return Window;
}
Что здесь происходит? Функция _beginthread завершилась, потом функция txCreateWindow завершилась, стек очищен. Поток пытается использовать локальные данные WindowParam data, которых уже не существует.
Попробуйте и сравните
C++
1
2
3
4
5
6
7
8
HWND txCreateWindow (const int width, const int height, const char* name)
    {
    WindowParam data = {width, height, name};
 
    _beginthread (txCreateWindowThreadProc, 0, (void*) &data);
 
    Sleep( 100 ); //   txCreateWindow  приостановила работу, чтобы  поток мог обработать данные   WindowParam data 
    return Window;
Другой вариант - вместо &data передавать какой-то другой адрес. Который имеет смысл и после завершения txCreateWindow.
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2018, 15:04

Таймер в параллельном потоке
Всем доброго времени. Начал изучать много-поточное программирование и сразу наткнулся на сложность....

ProgressBar в параллельном потоке
Здравствуйте, пишу на qt 3.3 . Необходимо сделать прогресс бар при записи на двд диск под...

Выполнение процедуры в параллельном потоке
Простая задача, но у нас параллельного программирования не было и наверное не будет. Есть процедура...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.