С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100

Постоянный вызов функции в произвольном потоке

25.02.2015, 01:12. Показов 2599. Ответов 10
Метки нет (Все метки)

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

C++
1
HANDLE customThread;
и попробовал его запустить с функцией:

C++
1
customThread = CreateThread(NULL, 0, Update, 0.1f, 0, NULL);
сама функция апдейта:

C++
1
2
3
4
void BulletManager::Update(float time)
{
    cout<<"Update\n";
}
По сайбер форуму копался, ничего такого, что прояснило бы меня, не нашел(( поэтому извиняюсь, в многопоточности я пока всего лишь теоретик. Надеюсь на вашу помощь
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2015, 01:12
Ответы с готовыми решениями:

Постоянный вызов функции
Есть функция,в которой бесконечный цикл вызывает другие функции,отвечающие за отрисовку. System::Void Render(System::Void) { ...

Вызов рекурсивной функции в отдельном потоке
Добрый день. Пытаюсь реализовать рекурсивный поиск файлов по заданной маске по каталогам в отдельном потоке. При рекурсивном вызове...

Вызов функции класса рекурсивно в потоке
Что бы долго не объяснять в чем проблема, выложу проект. Суть в 2-х словах: я уже обращался с темой &quot;Дерево Пифагора&quot; ранее в...

10
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
25.02.2015, 01:17
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.02.2015, 10:11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool work = true;//глабальная переменная 
 
 
void BulletManager::Update(float time)
{
while(work)
{
//some work
sleep(10);
}
}
 
customThread = CreateThread(NULL, 0, Update, 0.1f, 0, NULL);
ф-ция с циклом, пока work == true;
когда надо цикл остановить, её просто надо перевести в false
1
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
25.02.2015, 10:35  [ТС]
По поводу цикла спасибо) Из разряда очумелые ручки, но как я понял, других вариантов нет)) Но вот по поводу вызова потока.. Дело в том, что он неправильный, точнее я передаю неправильно метод и его сигнатуру. Есть идеи, где именно я допускаю ошибку?

C++
1
customThread = CreateThread(NULL, 0, Update, 0.1f, 0, NULL);

З.Ы.: Дико извиняюсь, что забыл скинуть код ошибки, которую выдает компилятор (забыл, блин, пустоголовый)
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.02.2015, 11:05
эм...

C++
1
2
float *f = new float(0.1);
customThread = CreateThread(NULL, 0, &Update, (void*)f, 0, NULL);
C++
1
2
3
4
5
6
7
8
9
10
11
void Update(void * p)
{
float *f = reinterpret_cast<float*>(p);
float param = *f;
while()//
{
///
}
 
delete f;
}
Добавлено через 25 минут
кстати, а что пишете то? судя по всему игру? с каким движком?
возможно и поток то не нужен, в движке есть гблобалные ф-ции апдайта, Вам ее нажно посетить, а в ней делать апдейт всем юнитам
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.02.2015, 12:49
Цитата Сообщение от Noobass Посмотреть сообщение
Дело в том, что он неправильный, точнее я передаю неправильно метод и его сигнатуру.
метод нельзя передавать. Передавать можно статическую функцию класса, либо обычную свободную функцию. Для передачи контекста в поток есть специальный параметр. Вот описание функции:
C++
1
2
3
4
5
6
7
8
HANDLE WINAPI CreateThread(
  _In_opt_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_       SIZE_T dwStackSize,
  _In_       LPTHREAD_START_ROUTINE lpStartAddress,
  _In_opt_   LPVOID lpParameter,   // <--- вот этот параметр
  _In_       DWORD dwCreationFlags,
  _Out_opt_  LPDWORD lpThreadId
);
Классический способ получить вызов метода в этих условиях - это передать указатель на нужного объекта через этот параметр. А внутри потока преобразовать void * к нужному типу указателя и вызвать метод.

А вообще, все это не нужно. Есть же std::thread.
1
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 100
25.02.2015, 16:38  [ТС]
LaLarman, работаю в гейм девелопменте, но никогда не было больших игр, где нужно управление несколькими потоками, и вот как видите, пытаюсь все освоить самостоятельно

DrOffset, std::thread ведь в С++ 11 появились, ведь так? Это получается, чтобы юзать std::thread, мне будет нужно сдуть 2011 студию?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.02.2015, 16:40
Цитата Сообщение от Noobass Посмотреть сообщение
и вот как видите, пытаюсь все освоить самостоятельно
раз уж такая пьянка, Вы про синхронизацию потоков почитайте) и про доступ к общим данным
0
1 / 1 / 3
Регистрация: 13.02.2015
Сообщений: 28
25.02.2015, 21:38
Зачем вам многопоточность в тетрисе ? Ни ужели у вас такой большой проект что необходима многопоточность ?
А про глобальные булевы переменные, это нихрена не синхронизация, так как синхронизацию надо выполнять функциями ОС, на крайний случай можно самому реализовать критические секций...но это не тот случай.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.02.2015, 21:44
Цитата Сообщение от eseeelil Посмотреть сообщение
это нихрена не синхронизация
так это ежу понятно хД, это был пример прекращения работы цикла

Добавлено через 53 секунды
Цитата Сообщение от eseeelil Посмотреть сообщение
на крайний случай можно самому реализовать критические секций...но это не тот случай
уже давно в стандарте реализовали
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.02.2015, 22:56
Цитата Сообщение от Noobass Посмотреть сообщение
Это получается, чтобы юзать std::thread, мне будет нужно сдуть 2011 студию?
В 2010 update 4, кажется уже доступно. И в boost:: есть его эквивалент (и прародитель ) boost::thread, работает везде, где есть boost.
В принципе можно использовать и нативные функции работы с потоками. Просто некоторые трудности нужно будет самостоятельно преодолевать. Ну, в любом случае это полезно для тренировки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2015, 22:56
Помогаю со студенческими работами здесь

Вызов функции с задержками в отдельном потоке
Добрый вечер, господа. В общем, возникла у меня небольшая совсем проблемка при работе с контроллом trackBar. Собственно, что мне от этого...

Вызов функции с двумя параметрами в новом потоке
public void Func(float A, float B){ } Thread myThreadMD1 = new Thread( Func( Aa, Bb)) myThreadMD1.Start(); Говорит что...

Постоянный вызов метода основного класса в наследованном классе
Всем привет! Вопрос про наследование. Можно сделать так, чтобы при вызове в производном классе переопределённого метода (который в базовом...

Вызов процедуры в потоке
Пытаюсь вызвать процедуры в потоке. пишет ошибку неизвестный идентификатор procedure TMyThread.Execute; begin inherited; ...

Вызов метода в потоке
Подскажите в чем моя ошибка. Пытаюсь вызвать метод в потоке и получаются следующие ошибки A::StopThreadClickHandler: в вызове...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru