Вторник, 23 Апреля 2024, 17:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » C/C++ » Потоки?
Потоки?
DeswingДата: Пятница, 20 Сентября 2013, 20:13 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Что такое потоки в С++?
У меня есть цель: создать два параллельно работающих потока. Один поток будет проводить вычисления, а второй - выводить графику (в консоли).
Ума не приложу как это реализовывается, помогите пожалуйста! Двойная буферизация == два потока???

P.S. ОЧЕНЬ извиняюсь за свою непросветленность, я всего лишь студент первого курса sad
romgermanДата: Пятница, 20 Сентября 2013, 20:50 | Сообщение # 2
старожил
Сейчас нет на сайте
Берёшь один поток, ставишь в него свою функцию. Берёшь второй, ставишь в него свою вторую функцию. > PROFIT! (Ну-ка умняши, поправьте меня)
GameMixДата: Пятница, 20 Сентября 2013, 20:51 | Сообщение # 3
старожил
Сейчас нет на сайте
Deswing, создаёшь класс, для каждого потока свой. Затем в главной программе создаёшь объекты для потоков и стартуешь их при надобности.
Пример/
Код заголовочного файла потока
Код
class Armstrong : public TThread
{
protected:
           void __fastcall Execute(); // функция для запуска потока
public:
           __fastcall Armstrong(bool CreateSuspended); // создать поток замороженным или нет
};

Файл реализации:
Код
__fastcall Armstrong::Armstrong(bool CreateSuspended): TThread(CreateSuspended)
{

}

void __fastcall Armstrong::Execute()
{

}

Ну и в главном файле программы:
Код
Armstrong *Test = new Armstrong(true);
Armstrong->Execute();


Steel Standoff - 2D аркада.
Мои статьи


Сообщение отредактировал GameMix - Пятница, 20 Сентября 2013, 20:54
sosiso4kaДата: Пятница, 20 Сентября 2013, 20:52 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата (romgerman)
Ну-ка умняши, поправьте меня

нечего тебя поправлять. Deswing, делай как сказал мистер romgerman, и получишь зачёт


Не гони на меня и будешь счастлив
DeswingДата: Пятница, 20 Сентября 2013, 21:03 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Цитата (sosiso4ka)
Deswing, делай как сказал мистер romgerman, и получишь зачёт

Нет, что Вы, подобному нас на первом курсе учить не планируют (вроде)) ). Это необходимость души, так сказать smile
GameMix, спасибо большое за отклик! То есть получается, что потоки всего лишь быстро переключаются друг через друга? Но это, как я понял, решение для одноядерных процессоров? (предположу что каждый поток можно повесить на ядро. Могу глупость ляпнуть. P.S. необходимости в этом нет, это просто для справки, стало интересно).
И, извините конечно, но из приведенного примера мне не особо многое понятно sad Можете чуть проще описать?
То, что я понял: нужно создать класс "Поток", и все объекты его будут быстро переключаться между собой, тем самым переключаясь между задачами.
Всякие _fastcall и armstrong я не очень понял sad И с моей точки зрения (точки зрения зеленого новичка) я вижу пустой класс sad
Простите за мою неопытность, но можете немного помочь мне, объяснив или натолкнув на верную мысль?
romgermanДата: Пятница, 20 Сентября 2013, 21:06 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата (Deswing)
Но это, как я понял, решение для одноядерных процессоров? (предположу что каждый поток можно повесить на ядро. Могу глупость ляпнуть.

Deswing, можно создать сколько угодно потоков. Можно сделать, что угодно.
Цитата (Deswing)
То есть получается, что потоки всего лишь быстро переключаются друг через друга?

Цитата (Deswing)
То, что я понял: нужно создать класс "Поток", и все объекты его будут быстро переключаться между собой, тем самым переключаясь между задачами.

Нет. Зачем. Потоки работают одновременно. Ты можешь включить или отключить поток.
DeswingДата: Пятница, 20 Сентября 2013, 21:08 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Цитата (romgerman)
Нет. Зачем. Потоки работают одновременно. Ты можешь включить или отключить поток.

т.е. это не моего ума дело, всё за меня решит ОС? А как они работают одновременно на одноядерных компьютерах?
У меня разрыв шаблона wacko
romgermanДата: Пятница, 20 Сентября 2013, 21:15 | Сообщение # 8
старожил
Сейчас нет на сайте
Deswing, я точно не знаю, но ВОТ.

Добавлено (20.09.2013, 21:10)
---------------------------------------------
Там всё написано.

Добавлено (20.09.2013, 21:15)
---------------------------------------------
Вот ещё почитай.

sosiso4kaДата: Пятница, 20 Сентября 2013, 21:54 | Сообщение # 9
был не раз
Сейчас нет на сайте
Цитата (Deswing)
Нет, что Вы, подобному нас на первом курсе учить не планируют (вроде)) ). Это необходимость души, так сказать

пардон, не знал
не программист я

Добавлено (20.09.2013, 21:54)
---------------------------------------------
точнее не собирался на него учиться


Не гони на меня и будешь счастлив
НохчиДата: Пятница, 20 Сентября 2013, 23:06 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
Цитата (Deswing)
т.е. это не моего ума дело, всё за меня решит ОС? А как они работают одновременно на одноядерных компьютерах?

Каждому потоку в системе дается определенный квант времени. По истечении этого времени поток приостанавливается и начинает выполняться следующий поток.


Многие вопросы по Windows отпадут, если посмотреть тут
DeswingДата: Пятница, 20 Сентября 2013, 23:59 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
Нохчи, romgerman, спасибо большое, конкретно на этот вопрос нашел более или менее понятный ответ.

Так кто-нибудь может объяснить как в С++ создать поток? sad
Код-пример уже предоставили, но в нём есть много непоняток sad
НохчиДата: Суббота, 21 Сентября 2013, 00:07 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
Цитата (Deswing)
Так кто-нибудь может объяснить как в С++ создать поток?

Поток создается функцией beginthread. Об этих борландовских приблудах из поста #3 даже не думай.


Многие вопросы по Windows отпадут, если посмотреть тут

Сообщение отредактировал Нохчи - Суббота, 21 Сентября 2013, 00:11
DeswingДата: Суббота, 21 Сентября 2013, 00:30 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Цитата (Нохчи)
beginthread

ф-ция из process.h?
А пример самый простейший можно?

Добавлено (21.09.2013, 00:30)
---------------------------------------------
нашёл _beginthread & _beginthreadex . "Стартовый адрес", "размер стека", "список аргументов"... И почему ф-ция помечена как "нативный код"? (нативный==машинный?)
В общем как работать с этим мне пока не ясно sad

morgloddДата: Суббота, 21 Сентября 2013, 00:47 | Сообщение # 14
частый гость
Сейчас нет на сайте

Первая ссылка в гугле

Совет ТС:


C++/C#/PHP/JavaScript/ASM
HackTrucachДата: Суббота, 21 Сентября 2013, 01:37 | Сообщение # 15
участник
Сейчас нет на сайте
Мне кажется что всё таки лучше так:
Высеслил
Отрендерил
Вычеслил
Отрендерил

Иначе при многопоточности может получится что либо рендерит не обновившуюся сцену либо рендерит не до конца обновишуюся сцену, что пичально.


Организатор флешмоба #100игрзанеделю
DeswingДата: Суббота, 21 Сентября 2013, 19:22 | Сообщение # 16
заслуженный участник
Сейчас нет на сайте
ок, а как _beginthread'ы синхронизировать?

Добавлено (21.09.2013, 19:22)
---------------------------------------------
пишу так:
_beginthread(myThread, 0, NULL);
_beginthread(myThread2, 0, NULL);

и вижу, что какой-то поток работает быстрее, а какой-то - медленнее...
И вообще мне не очень ясно что происходит. Ведь так работает сразу два потока, но как после вызова первого потока вызывается второй??

Как с помощью данной функции реализовать двойную буферизацию для игры? П.с. ради устранения "блымов" в консоли

IzaronДата: Суббота, 21 Сентября 2013, 19:42 | Сообщение # 17
Rammstein forever
Сейчас нет на сайте
Цитата (GameMix)
Deswing, создаёшь класс, для каждого потока свой. Затем в главной программе создаёшь объекты для потоков и стартуешь их при надобности. Пример/ Код заголовочного файла потока

Это че, билдер? *слоу*
Цитата (romgerman)
Вот ещё почитай.

Это че, не С++? *слоу*

Еще можно создавать потоки с помощью CreateThread, функция передается как DWORD WINAPI func(void*)

Добавлено (21.09.2013, 19:42)
---------------------------------------------

Цитата (HackTrucach)
Мне кажется что всё таки лучше так: Высеслил Отрендерил Вычеслил Отрендерил

Не всегда, в случае с асинхронными сокетами, например (чятик - лучший пример)
DeswingДата: Суббота, 21 Сентября 2013, 19:52 | Сообщение # 18
заслуженный участник
Сейчас нет на сайте
Цитата (Izaron)
Еще можно создавать потоки с помощью CreateThread, функция передается как DWORD WINAPI func(void*)

но там вроде всякие cout не работают?

ап:
Цитата (Deswing)
_beginthread(myThread, 0, NULL);
_beginthread(myThread2, 0, NULL);

и вижу, что какой-то поток работает быстрее, а какой-то - медленнее...
И вообще мне не очень ясно что происходит. Ведь так работает сразу два потока, но как после вызова первого потока вызывается второй??

Как с помощью данной функции реализовать двойную буферизацию для игры? П.с. ради устранения "блымов" в консоли
ApatiДата: Суббота, 21 Сентября 2013, 19:57 | Сообщение # 19
заслуженный участник
Сейчас нет на сайте
http://www.ozon.ru/context/detail/id/4079733/
IzaronДата: Суббота, 21 Сентября 2013, 20:02 | Сообщение # 20
Rammstein forever
Сейчас нет на сайте
Цитата (Deswing)
но там вроде всякие cout не работают?

Все там работает

Если мы запустим поток, который постоянно (while(true)) выводит число 0, а главный поток (это функция main) после запуска другого потока постоянно выводит число 1, то будет выводится то 1, то 0, причем не всегда попеременно (0-1-0-1-0-1-0), а иногда так: (0-0-0-1-1-0-1-0-0-1-1-1-0-1-0-1)
Форум игроделов » Программирование » C/C++ » Потоки?
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг