Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Движение двух фигур в разных потоках

03.01.2014, 23:08. Показов 2046. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!всех с новым годом!и снова я к вам с моими проблемами)
короче пишу игрушку в консоле,столкнулся впервые с многопоточностью)использую стандартную библиотеку c++ <thread> для создания потоков и работы с ними.так же использую инициализацию графики в консоли с помощью библиотеки msoftcon.h.
Все бы хорошо,но есть одна проблема...как выразиться лучше то...мне нужно чтобы две фигуры на экране двигались независимо друг от друга...но суть в том,что установка курсора set_cursor_pos(x,y) не успевает нарисовать одну фигуру и переходит к другой резко...и получается полная хрень...вначале я не понимал в чем трабл,но когда написал вот такую скромную программку(ниже код),то понял что дело все в курсоре:
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
#include <iostream>
#include <thread>
#include "msoftcon.h"
 
void Thread()   
{
for(int i=1;i<25;i++)
{
set_cursor_pos(1,i);
wait(100);
std::cout<<"*";
}
}
 
void main()
{
init_grafics();
std::thread f(Thread);
 
for(int i=1;i<25;i++)
{
set_cursor_pos(80,i);
wait(50);
std::cout<<"+";
}
 
f.join();
}
Программка рисует по вертикали в дополнительном потоке слева с задержкой 100 миллисекунд символ "*" а в основном потоке по вертикале рисуется справа символ "+" с задержкой 50 миллисекунд и затем он ждет пока закончит выполнение дополнительный поток(f.join(); функция).вроде все просто и понятно)
но вот в чем проблема-символы вывода иногда находятся не в том месте где им нужно быть,к примеру иногда символ "*" находится справа,а символ "+" слева,хотя это не должно быть!я долго не думал,и понял что проблема с установкой курсора(set_cursor_pos(...); функция)...но вот как исправить я так и не догадался.мне нужно два курсора,чтобы один работал с дополнительным потоком,а другой с основным...но реально ли это в консоле на c++ или можно как нибудь сделать подругому все?
Ребята,срочно нужна ваша помощь...без этого не могу продвинуться(разбираюсь в winAPI не много,поэтому можете примеры решения подсказать на нем)

Добавлено через 23 часа 22 минуты
Аууу народ?мне кто нибудь поможет?)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.01.2014, 23:08
Ответы с готовыми решениями:

Как обеспечить синхронизацию двух событий, описанных в разных потоках методом execute()
Добрый день! Подскажите пожалуйста, как обеспечить синхронизацию двух событий, описанных в разных потоках методом execute() ? В первом-...

Реализовать движение разных фигур по разным траекториям
Нужно сделать движение разных фигур по разной траектории...т.е. выбрал фигуру..какой-то квадратик или кружок и выбрал для него...

Движение двух фигур.
В которой будет пара фигур, которые будут двигаться по окну

2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 00:55
Задумайтесь немного. Потока 2, а консоль одна. Потоки между собой никак не синхронизированы, т.е. вполне возможна ситуация, когда один поток установил курсор, а другой начинает вывод. В итоге - вывод не там, где мы ожидали. Поэтому необходимо добавить один из механизмов синхронизации: мютекс, критическую секцию, семафор и т.п.
2
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
07.01.2014, 14:02  [ТС]
Спасибо за ответ,раньше уже нашел)использую библиотеку мьютекса <mutex> ,вроде все работает)

Добавлено через 23 часа 50 минут
А теперь у меня следующий вопрос...я начал использовать мьютекс в своей игре,но выгодно ли это?разделение данных у меня идет только при двух операциях - установки курсора(set_cursor_pos) и нарисования части фигуры(std::cout<<'o') и это происходит для прорисовки двух фигур одновременно в двух разных потоках в один и тот же промежуток времени.
Выгодно ли использовать мьютекс здесь,или посоветуете что нибудь более подходящее в этом случае?

Добавлено через 14 часов 44 минуты
Есть тут кто?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2014, 14:02
Помогаю со студенческими работами здесь

Может ли один делегат одновременно работать в двух разных потоках?
Вечер добрый. Такой вопрос. Я так понимаю, один делегат не может одновременно работать в двух разных потоках? Как-то так?

Не работают getch() и cin в двух разных потоках на ввод одновременно/Как снизить нагрузку на процессор?
Код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;conio.h&gt; #include &lt;thread&gt; // g++ th.cpp -o th -lws2_32 -std=c++11 ...

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

Циклы обработки сообщений разных форм в разных потоках
Здравствуйте! Подскажите как реализовать циклы обработки сообщений разных форм в разных потоках. У коде одной формы сделал так: ...

Изменение разных элементов вектора в разных потоках даёт отличный от join() результат, нежели при detach()
Имеется using V = vector&lt;double&gt;; using M = vector&lt;V&gt;; Есть функция матричного умножения A*B. На каждую вектор-строку матрицы A я...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru