Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
1

Создание потока по нажатию на клавишу

05.06.2016, 23:43. Показов 1517. Ответов 13
Метки нет (Все метки)

Вот такое задание:
Написать програму, которая создает поток по нажатию на клавишу. Каждому созданому в такой способ потоку отвечает круг в окне.

Вот такой код:
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
97
98
99
100
101
102
103
104
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <process.h>
#define BUFSIZE 65535 
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI KOLO(LPVOID iNum);
LRESULT CALLBACK POTOK(HWND, UINT, WPARAM, LPARAM);
 
TCHAR WinName[] = _T("MainFrame");
 
HINSTANCE hInst;
 
int APIENTRY _tWinMain(HINSTANCE This,
HINSTANCE Prev,
LPTSTR cmd,
int mode)
{
HWND hWnd;
MSG msg;
hInst=This;
 
WNDCLASS wc;
 
wc.hInstance =This;
wc.lpszClassName = WinName;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
 
if (!RegisterClass(&wc)) return 0;
 
hWnd = CreateWindow(WinName, _T("Мильні бульбашки"), WS_OVERLAPPEDWINDOW, 20, 20, 800, 600, NULL, NULL, This, NULL);
ShowWindow(hWnd, mode);
 
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
int x,y,nap,i;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ 
HDC hdc;
PAINTSTRUCT rs;
RECT rt;
char sztemp3[32]={0};
GetClientRect(hWnd,&rt); 
const int R=100; // радиус объекта
char szteme[32]={0};
DWORD ThreadId;
HANDLE Thread;
switch(message)
{
case WM_CREATE:
srand(GetTickCount());
x=rand()%(rt.right-100);
y=rand()%(rt.bottom-100);
nap=rand()%3+1;
SetTimer(hWnd,1,1,NULL);
break;
case WM_COMMAND:
if(wParam=69)
{
 
}
break;
case WM_TIMER: 
{ 
if((x>=rt.right-100)&&(nap==1)) nap=2;
if((x<=rt.left)&&(nap==2)) nap=1; 
if((y>=rt.bottom-100)&&(nap==4)) nap=3; 
if((y<=rt.top)&&(nap==3)) nap=4;
if(nap==1) x+=1;
if(nap==2) x-=1; 
if(nap==3) y-=1;
if(nap==4) y+=1;
InvalidateRect(hWnd, NULL, TRUE);
}
break;
 
case WM_PAINT:
hdc=BeginPaint(hWnd,&rs);
Ellipse(hdc,x,y,x+R,y+R);
EndPaint(hWnd,&rs);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
 
return 0;
}
С потоком не получается!!!!!!!!!!!!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2016, 23:43
Ответы с готовыми решениями:

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200); По нажатию на кнопку из...

Событие по нажатию на клавишу(консоль)
connect.Open();// конект епта Console.WriteLine(&quot;Подключение успешно, для...

Выход из цикла по нажатию на клавишу
Необходимо выйти из цикла по нажатию на клавишу 'q'. Схема такая: repeat //Вызов процедур until...

Открытие файла по нажатию на клавишу
Подскажите пожалуйста как сделать чтобы при нажатии &quot;H&quot; мне открывался текстовый фаил с спавкой об...

13
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
06.06.2016, 00:23 2
mvwitalij2009, Так, а что именно не получается-то?
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
06.06.2016, 00:24  [ТС] 3
создать несколько кругов в окне
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
06.06.2016, 00:25 4
mvwitalij2009, Так где в твоем коде обрабатывается нажатие клавиши, где создание самого потока?
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
06.06.2016, 00:26  [ТС] 5
проблема с созданием потока
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
06.06.2016, 00:26 6
Проблема состоит в том, что ты не умеешь его создавать?
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
06.06.2016, 00:28  [ТС] 7
Проблема состоит в том как сделать чтобы при каждом создании потока появлялся новый круг. Это я незнаю как реализовать
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
06.06.2016, 00:29 8
mvwitalij2009, На какую клавишу ты хочешь себе создание круга?
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
06.06.2016, 00:31  [ТС] 9
на клавишу R
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
06.06.2016, 01:11 10
mvwitalij2009,
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <windows.h>
#include <tchar.h>
#include <vector>
#define BUFSIZE 65535 
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
struct Elips
{   
    HANDLE hThread;
    int cx;
    int cy;
    int nap;
};
 
std::vector<Elips> massEllipse;
 
TCHAR WinName[] = _T("MainFrame");
 
int APIENTRY _tWinMain(HINSTANCE This,
    HINSTANCE Prev,
    LPTSTR cmd,
    int mode)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS wc;
 
    wc.hInstance = This;
    wc.lpszClassName = WinName;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
 
    if (!RegisterClass(&wc)) return 0;
 
    hWnd = CreateWindow(WinName, _T("Мильні бульбашки"), WS_OVERLAPPEDWINDOW, 20, 20, 800, 600, NULL, NULL, This, NULL);
    ShowWindow(hWnd, mode);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
 
DWORD WINAPI ThreadBall(LPVOID lParam)
{
    HWND hWnd = (HWND)lParam;
 
    RECT rt;
    GetClientRect(hWnd, &rt);
    int Index = massEllipse.size() - 1;
    Elips CurrentElips = massEllipse[Index];
    srand(GetTickCount());
    CurrentElips.cx = rand() % (rt.right - 100);
    CurrentElips.cy = rand() % (rt.bottom - 100);
    CurrentElips.nap = rand() % 3 + 1;
 
    while (true)
    {
        if ((CurrentElips.cx >= rt.right - 100) && (CurrentElips.nap == 1)) CurrentElips.nap = 2;
        if ((CurrentElips.cx <= rt.left) && (CurrentElips.nap == 2)) CurrentElips.nap = 1;
        if ((CurrentElips.cy >= rt.bottom - 100) && (CurrentElips.nap == 4)) CurrentElips.nap = 3;
        if ((CurrentElips.cy <= rt.top) && (CurrentElips.nap == 3)) CurrentElips.nap = 4;
        if (CurrentElips.nap == 1) CurrentElips.cx += 1;
        if (CurrentElips.nap == 2) CurrentElips.cx -= 1;
        if (CurrentElips.nap == 3) CurrentElips.cy -= 1;
        if (CurrentElips.nap == 4) CurrentElips.cy += 1;
        massEllipse[Index] = CurrentElips;
        InvalidateRect(hWnd, NULL, TRUE);
        Sleep(55);
    }
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT rs;
    const int R = 100; // радиус объекта
    switch (message)
    {
    case WM_CREATE:
        break;
    case WM_KEYDOWN:
        if (wParam == 0x52) // Клавиша R
        {
            Elips NewElips;
            NewElips.hThread = CreateThread(NULL, 0, *ThreadBall, (LPVOID)hWnd, 0, NULL);
            massEllipse.push_back(NewElips);
        }
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &rs);
        for (int i = 0; i < massEllipse.size(); i++)
        {
            Ellipse(hdc, massEllipse[i].cx, massEllipse[i].cy, massEllipse[i].cx + R, massEllipse[i].cy + R);
        }
        EndPaint(hWnd, &rs);
        break;
    case WM_DESTROY:
        for (int i = 0; i < massEllipse.size(); i++)
        {
            CloseHandle(massEllipse[i].hThread);
        }
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 33 секунды
Надеюсь это то, что ты хотел)
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
06.06.2016, 01:16  [ТС] 11
Спасибо
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
06.06.2016, 01:26 12
mvwitalij2009, Я немного изменил код, чтобы не было нагрузок и корректно отображало.

Добавлено через 2 минуты
mvwitalij2009,
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <windows.h>
#include <tchar.h>
#include <vector>
#define BUFSIZE 65535 
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
struct Elips
{   
    HANDLE hThread;
    int cx;
    int cy;
    int nap;
};
 
std::vector<Elips> massEllipse;
 
TCHAR WinName[] = _T("MainFrame");
 
int APIENTRY _tWinMain(HINSTANCE This,
    HINSTANCE Prev,
    LPTSTR cmd,
    int mode)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS wc;
 
    wc.hInstance = This;
    wc.lpszClassName = WinName;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
 
    if (!RegisterClass(&wc)) return 0;
 
    hWnd = CreateWindow(WinName, _T("Мильні бульбашки"), WS_OVERLAPPEDWINDOW, 20, 20, 800, 600, NULL, NULL, This, NULL);
    ShowWindow(hWnd, mode);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
 
DWORD WINAPI ThreadBall(LPVOID lParam)
{
    HWND hWnd = (HWND)lParam;
 
    RECT rt;
    GetClientRect(hWnd, &rt);
    int Index = massEllipse.size() - 1;
    Elips CurrentElips = massEllipse[Index];
    srand(GetTickCount());
    CurrentElips.cx = rand() % (rt.right - 100);
    CurrentElips.cy = rand() % (rt.bottom - 100);
    CurrentElips.nap = rand() % 3 + 1;
 
    while (true)
    {
        if ((CurrentElips.cx >= rt.right - 100) && (CurrentElips.nap == 1)) CurrentElips.nap = 2;
        if ((CurrentElips.cx <= rt.left) && (CurrentElips.nap == 2)) CurrentElips.nap = 1;
        if ((CurrentElips.cy >= rt.bottom - 100) && (CurrentElips.nap == 4)) CurrentElips.nap = 3;
        if ((CurrentElips.cy <= rt.top) && (CurrentElips.nap == 3)) CurrentElips.nap = 4;
        if (CurrentElips.nap == 1) CurrentElips.cx += 1;
        if (CurrentElips.nap == 2) CurrentElips.cx -= 1;
        if (CurrentElips.nap == 3) CurrentElips.cy -= 1;
        if (CurrentElips.nap == 4) CurrentElips.cy += 1;
        massEllipse[Index] = CurrentElips;
        Sleep(20); // По сути, это скорость движения круга
    }
    return 0;
}
DWORD WINAPI ThreadPaint(LPVOID lParam) //Поток который обновляет окно каждые 35 милисекунд
{
    HWND hWnd = (HWND)lParam;
    while (true)
    {
        InvalidateRect(hWnd, NULL, TRUE);
        Sleep(35);
    }
    return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT rs;
    const int R = 100; // радиус объекта
    static HANDLE hThreadPaint;
    switch (message)
    {
    case WM_CREATE:
        hThreadPaint = CreateThread(NULL, 0, *ThreadPaint, (LPVOID)hWnd, 0, NULL);
        break;
    case WM_KEYDOWN:
        if (wParam == 0x52) // Клавиша R
        {
            Elips NewElips;
            NewElips.hThread = CreateThread(NULL, 0, *ThreadBall, (LPVOID)hWnd, 0, NULL);
            massEllipse.push_back(NewElips);
        }
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &rs);
        for (int i = 0; i < massEllipse.size(); i++)
        {
            Ellipse(hdc, massEllipse[i].cx, massEllipse[i].cy, massEllipse[i].cx + R, massEllipse[i].cy + R);
        }
        EndPaint(hWnd, &rs);
        break;
    case WM_DESTROY:
        for (int i = 0; i < massEllipse.size(); i++)
        {
            CloseHandle(massEllipse[i].hThread);
        }
        CloseHandle(hThreadPaint);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 2 минуты
В прошлом коде который я скидывал есть проблема в том, что окно обновлялось каждые 55 мили секунд. Вроде бы всё нормально, но если потоков несколько следственно будет несколько вызовов за эти 55 мили секунд. К примеру если мы создали 11 шариков за 55 мили секунд окно будет обновляться каждых 5 мили секунд.
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 11
06.06.2016, 01:29  [ТС] 13
Спасибо за помощь. Задали в университете, а С++ изучаю пару недель)
0
maks242
06.06.2016, 01:29     Создание потока по нажатию на клавишу
  #14

Не по теме:

Успехов в обучении)

0
06.06.2016, 01:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2016, 01:29
Привет! Вот еще темы с ответами:

Переместить квадрат по нажатию на клавишу
всем,привет) Ребята,помогите,пожалуйста: программировать на си шарпе начал недавно,решил написать...

Как включить функцию по нажатию на клавишу
Подскажите как такое осуществить: мне нужно , чтобы по нажатию на клавишу которая была выбрана в...

Закрытие программы по нажатию на клавишу (комбинацию клавиш)
Хо! Есть код, который выполняет некие действия (без разницы вообще что, но главное - его нельзя...

По нажатию на клавишу Enter нажималась кнопка на форме
Здравствуйте. Как сделать, чтоб по нажатию на кнопку Enter кликалась кнопка на форме? Спасибо...


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

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

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