Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
524 / 400 / 213
Регистрация: 28.07.2011
Сообщений: 2,219

Потоки управляют шарами

10.05.2015, 17:14. Показов 795. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Нужна ваша помощь, вот задание:
Написать программу, содержащую два потока, каждый из которых управляет движением одного из двух шаров. Первый шар двигается горизонтально, второй - вертикально. Скорость шаров различна. При достижении границы клиентской области окна, шар меняет направление движения на противоположное. При помощи объектов синхронизации (семафоров или событий) реализовать алгоритм движения шаров без столкновений.

есть код, но он какой-то кривой
т.к шары сталкиваются, да и почему-то при запуске шар появляется вне окна оО
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <windows.h>
#include <process.h>
#include <stdlib.h>
 
#define WM_T_GO (WM_USER + 1)
#define WM_T_STOP (WM_USER + 2)
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[] = "WindowsApp";
int cxClient, cyClient;
int i, j;
int hTurn = 0, vTurn = 0;
int R = 40;
int stop = 0;
 
HWND hwnd;
int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
 
{
    /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx(&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx(
        0,                   /* Extended possibilites for variation */
        szClassName,         /* Classname */
        "Лабораторная работа №6",       /* Title Text */
        WS_OVERLAPPEDWINDOW, /* default window */
        CW_USEDEFAULT,       /* Windows decides the position */
        CW_USEDEFAULT,       /* where the window ends up on the screen */
        230,                 /* The programs width */
        425,                 /* and height in pixels */
        NULL,        /* The window is a child-window to desktop */
        NULL,                /* No menu */
        hThisInstance,       /* Program Instance handler */
        NULL                 /* No Window Creation data */
        );
 
    /* Make the window visible on the screen */
    ShowWindow(hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage(&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
int crash()
{
    int result = 0;
    if ((i + R) == cxClient / 2 && (cyClient / 2 - j) >= -12 && (cyClient / 2 - j) <= 90 && vTurn == 0 && hTurn == 0) result = 1;//right down
    if ((i) == cxClient / 2 + R && (cyClient / 2 - j) >= -12 && (cyClient / 2 - j) <= 90 && vTurn == 0 && hTurn == 1) result = 1;//left down
    if ((i) == cxClient / 2 + R && (-cyClient / 2 + j) >= -12 && (-cyClient / 2 + j) <= 90 && vTurn == 1 && hTurn == 1) result = 1;//left up
    if ((i + R) == cxClient / 2 && (-cyClient / 2 + j) >= -12 && (-cyClient / 2 + j) <= 90 && vTurn == 1 && hTurn == 0) result = 1;//right up
    return result;
}
void Thread1(PVOID pvoid)
{
    HDC hdc;
    i = 0;
    int test;
    stop = 0;
 
    while (true)
    {
        hdc = GetDC(hwnd);
        SelectObject(hdc, GetStockObject(NULL_PEN));
        SelectObject(hdc, GetStockObject(WHITE_BRUSH));
        Ellipse(hdc, i, cyClient / 2, R + i, cyClient / 2 + R);
        Sleep(30);
        test = crash();
        if (test == 1) SendMessage(hwnd, WM_T_STOP, 0, 0);
        else SendMessage(hwnd, WM_T_GO, 0, 0);
        if (stop == 1){ Sleep(abs((cyClient / 2 - j) * 30)); }
        SelectObject(hdc, GetStockObject(BLACK_BRUSH));
        Ellipse(hdc, i, cyClient / 2, R + i, cyClient / 2 + R);
        ReleaseDC(hwnd, hdc);
        if (i + R == cxClient) hTurn = 1;
        else if (i == 0) hTurn = 0;
        if (hTurn == 0)i++;
        else i--;
    }
}
void Thread2(PVOID pvoid)
{
    HDC hdc;
    j = 0;
 
 
    while (true)
    {
        hdc = GetDC(hwnd);
        SelectObject(hdc, GetStockObject(NULL_PEN));
        SelectObject(hdc, GetStockObject(WHITE_BRUSH));
        Ellipse(hdc, cxClient / 2, j, cxClient / 2 + R, R + j);
        Sleep(20);
        SelectObject(hdc, GetStockObject(BLACK_BRUSH));
        Ellipse(hdc, cxClient / 2, j, cxClient / 2 + R, R + j);
        ReleaseDC(hwnd, hdc);
        if (j + R == cyClient) vTurn = 1;
        else if (j == 0) vTurn = 0;
        if (vTurn == 0)j++;
        else j--;
    }
}
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
    case WM_CREATE:
        _beginthread(Thread1, 0, NULL);
        _beginthread(Thread2, 0, NULL);
        break;
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        break;
    case WM_T_STOP:
        stop = 1;
        break;
    case WM_T_GO:
        stop = 0;
        break;
    case WM_DESTROY:
        PostQuitMessage(0);       /* send a WM_QUIT to the message queue */
        break;
    default:                      /* for messages that we don't deal with */
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2015, 17:14
Ответы с готовыми решениями:

Коды воздействуют на данные - структурное программирование, Данные управляют кодом - ООП
Это из книги Шилдта, я думал что всегда коды управляют данными, короче кто понимает обьясните

задача с шарами
Есть такая задача: Семь шаров раскладывают случайным образом по 7 ящикам. Како-ва вероятность, что в каждом ящике окажется по одному...

Урна с шарами
Здравствуйте, подскажите пожалуйста: Из урны, содержащей черные и белые шары, извлечены n шаров. Пусть Ai – событие, состоящее в том,...

1
524 / 400 / 213
Регистрация: 28.07.2011
Сообщений: 2,219
14.05.2015, 15:48  [ТС]
аппп
как правильно написать функцию
Code
1
int crash()
чтобы задержка была тогда, когда надо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2015, 15:48
Помогаю со студенческими работами здесь

Урна с шарами
Из урны, содерж. 5 белых и 7 черных шаров, вытаскивают с возвращением по одному шару. Найти вероятность события : на вытаскивании №9 в...

Из урны с пронумерованными шарами
1) Из урны с пронумерованными шарами (1...n) вынимают k шаров а затем возвращают обратно. Найти вероятность что эти шары образуют...

Заполнение формы шарами
Привет всем!!! Не так давно начал изучать программировании, выбрал для себя VB 6.0, сегодня целый день мучаюсь как заполнить форму шарами....

Проблема с шарами на 2х машинах
Здравствуйте. В одноранговой подсети нашего предприятия возникла проблема с доступом к общим ресурсам следующего характера. ...

Задача с шарами. Проверьте, пожалуйста
Здравствуйте! Проверьте, пожалуйста. Решения верны? P.S.: Тему назвала не правильно. Здесь 2 задачи, а не только задача с шарами....


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru