Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
1

Функция потока в классе

10.11.2015, 12:37. Показов 3082. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, как запихать в класс функцию потока (небольшой пример, если есть)?
когда пишу так:
C++
1
2
3
4
5
6
7
8
class abc{
DWORD WINAPI MyThread(LPVOID);
void StartTr();
};
void abc::StartTr()
{
CreateThread(NULL, 0, MyThread, NULL, 0, NULL);
}
Соответственно получаю ошибку
E2034 Cannot convert 'unsigned long (__stdcall * (_closure )(void *))(void *)' to 'unsigned long (__stdcall *)(void *)'
E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'void')
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2015, 12:37
Ответы с готовыми решениями:

Создание потока в классе
Всем здрасьте ! Меня волнует вопрос: Как создать поток в классе ? Находил много реализаций,...

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B?
#include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{...

По поводу потока и перегрузки оператора вставки в классе
#include <iostream> using namespace std; class three_d { public: int x, y, z; three_d(int a,...

Перегрузка операторов ввода и вывода из потока в шаблонном классе
Доброго времени суток. Пишу свой вектор. В нём надо перегрузить вышеназванные операторы. Vector.h...

38
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
10.11.2015, 12:53 2
Цитата Сообщение от klynxe Посмотреть сообщение
Подскажите, как запихать в класс функцию потока (небольшой пример, если есть)?
Принцип можно срисовать отсюда: https://www.cyberforum.ru/post8225359.html. Для всего низкоуровневого поточного API он одинаковый.

Добавлено через 3 минуты
PS. Параметр, приходящий в поточную функцию, задается четвертым по счету (lpParameter).
1
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
12.11.2015, 16:05  [ТС] 3
Хм, а можно без SDL_Thread? С CreateThread
0
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
12.11.2015, 16:08 4
klynxe, тебеж принцип говорят посмотри
1
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
12.11.2015, 16:15  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class abc{
DWORD WINAPI MyThread(LPVOID);
void StartTr();
static int StaticThread(void* self);
};
void abc::StartTr()
{
CreateThread(NULL, 0, &abc::StaticThread, NULL, 0, NULL);
}
static int StaticThread(void* self)
{
    return static_cast<abc*>(self)->MyThread();
}
не работает
E2034 Cannot convert 'int (*)(void *)' to 'unsigned long (__stdcall *)(void *)'
E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'int (*)(void *)')
E2247 '__stdcall abc::ReadThread(void *)' is not accessible
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
12.11.2015, 16:19 6
Прототип функции:
C++
1
2
3
DWORD WINAPI ThreadProc(
  _In_ LPVOID lpParameter
);
https://msdn.microsoft.com/ru-... 85%29.aspx
1
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
12.11.2015, 16:26  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
Прототип функции:
Не понял, к чему это?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
12.11.2015, 16:27 8
Цитата Сообщение от klynxe Посмотреть сообщение
Не понял к чему это?
к этому:
C++
1
2
3
4
static DWORD WINAPI StaticThread(LPVOID self)
{
//...
}
1
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
12.11.2015, 16:32  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
к этому:
спасибо, помогло, а еще
E2247 '__stdcall abc::ReadThread(void *)' is not accessible
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
12.11.2015, 16:35 10
Ну и
C++
1
2
3
4
void abc::StartTr()
{
CreateThread(NULL, 0, &abc::StaticThread, NULL, 0, NULL);
}
исправить, иначе получите параметр self равным 0.
C++
1
CreateThread(NULL, 0, &abc::StaticThread, (void*)this, 0, NULL);
Добавлено через 2 минуты
Цитата Сообщение от klynxe Посмотреть сообщение
а еще
E2247 '__stdcall abc::ReadThread(void *)' is not accessible
в приведенном куске кода нет упоминания abc::ReadThread, так что только гадать что там.
1
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
12.11.2015, 16:41  [ТС] 11
как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class abc{
DWORD WINAPI MyThread(LPVOID);
void StartTr();
static DWORD WINAPI StaticThread(LPVOID self);
};
void abc::StartTr()
{
CreateThread(NULL, 0, &abc::StaticThread, (void*)this, 0, NULL);
}
DWORD WINAPI abc::StaticThread(LPVOID self)
{
    return static_cast<abc*>(self)->MyThread(NULL);
}
Добавлено через 42 секунды
Цитата Сообщение от Croessmah Посмотреть сообщение
в приведенном куске кода нет упоминания abc::ReadThread, так что только гадать что там.
Да, сторонняя ошибка(
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
12.11.2015, 16:45 12
Цитата Сообщение от Croessmah Посмотреть сообщение
CreateThread(NULL, 0, &abc::StaticThread, (void*)this, 0, NULL);
Очень не безопасно, объект может быть уже уничтожен, а поток может еще работать. В таких случаях класс наследует std::enable_shared_from_this<> и в поток передается shared_from_this(). Ну и конструкторы прячутся в private.

Добавлено через 1 минуту
да и потоки можно использовать из C++11, либо enable_shared_from_this взять из boost'а, либо реализовать все это руками.
2
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
12.11.2015, 16:53 13
Цитата Сообщение от Kastaneda Посмотреть сообщение
Очень не безопасно, объект может быть уже уничтожен
ну тогда
Цитата Сообщение от Kastaneda Посмотреть сообщение
В таких случаях класс наследует std::enable_shared_from_this<> и в поток передается shared_from_this(). Ну и конструкторы прячутся в private.
компилятор может не поддерживать c++11.

Нам не ведано, что там и как у автора будет устроено, как будет синхронизироваться и т.д.
1
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
13.11.2015, 12:37  [ТС] 14
Цитата Сообщение от Croessmah Посмотреть сообщение
компилятор может не поддерживать c++11.
Нам не ведано, что там и как у автора будет устроено, как будет синхронизироваться и т.д.
Пишу код, который должен работать в VS13 и RadStudio XE8, думаю C++11 должны поддерживать.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Очень не безопасно, объект может быть уже уничтожен, а поток может еще работать. В таких случаях класс наследует std::enable_shared_from_this<> и в поток передается shared_from_this(). Ну и конструкторы прячутся в private.
Добавлено через 1 минуту
да и потоки можно использовать из C++11, либо enable_shared_from_this взять из boost'а, либо реализовать все это руками.
А можно чуть подробнее (без boots)? Пример какой, а то так я не очень знаю что такое enable_shared_from_this<>
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
13.11.2015, 14:33 15
Цитата Сообщение от klynxe Посмотреть сообщение
А можно чуть подробнее (без boots)? Пример какой, а то так я не очень знаю что такое enable_shared_from_this<>
Хотел пример написать, но потом подумал - WinAPI это сишный стиль, в поток передается void*, т.е. максимум, что ты можешь туда передать это указатель на shared_ptr, но shared_ptr уже может быть уничтожен к моменту запуска потока. Поэтому тут так не получится, нужна другая реализация создания потоков.
В общем следи за тем, чтобы время жизни объекта было >= времени жизни потока.
1
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
13.11.2015, 14:49 16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Хотел пример написать, но потом подумал - WinAPI это сишный стиль, в поток передается void*, т.е. максимум, что ты можешь туда передать это указатель на shared_ptr, но shared_ptr уже может быть уничтожен к моменту запуска потока. Поэтому тут так не получится, нужна другая реализация создания потоков
все получится. в деструкторе объекта сигнализируем потоку, что пора на выход и делаем join.
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
13.11.2015, 15:45 17
Цитата Сообщение от pproger Посмотреть сообщение
все получится. в деструкторе объекта сигнализируем потоку, что пора на выход и делаем join.
с таким подходом shared_ptr получается не нужен.
1
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
13.11.2015, 15:51 18
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поэтому тут так не получится, нужна другая реализация создания потоков.
Справедливости ради, std::thread через те же сишные функции реализован. Если ты ему join забудешь позвать, то будет та же самая картина: объект потока уничтожился, а сам поток еще работает.
1
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
13.11.2015, 15:53 19
Цитата Сообщение от Kastaneda Посмотреть сообщение
с таким подходом shared_ptr получается не нужен
таки нефиг пихать его везде подряд
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
13.11.2015, 15:55 20
Цитата Сообщение от DrOffset Посмотреть сообщение
Если ты ему join забудешь позвать, то будет та же самая картина: объект потока уничтожился, а сам поток еще работает.
Я имел ввиду другое.
C++
1
2
3
4
5
6
7
//псевдокод
ThreadPtr tp;
{
    MyClass ob;
    tp = createThread(ob);
}
tp->join();
join вызван, но поток работает с несуществующим объектом.

Добавлено через 51 секунду
Цитата Сообщение от DrOffset Посмотреть сообщение
Справедливости ради, std::thread через те же сишные функции реализован.
я внуть не смотрел, но подозреваю, что объект thread хранит в себе shared_ptr (или что ему передали) и он будет жить пока поток не завершится.
1
13.11.2015, 15:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2015, 15:55
Помогаю со студенческими работами здесь

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

Создание потока в классе
Здравствуйте. Хочу написать программу, которая бы общалась по нескольким com-портам с разными...

Запуск потока в классе
Никак не могу разобраться с потоками. Вообщем мне нужно каждые 2 секунды в потоке вызывать метод...

Статическая функция в классе
Делаю класс создания окна, для экономии кода хочу засунуть обработчик событий в этот же класс...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru