12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
|
||||||
1 | ||||||
Функция потока в классе10.11.2015, 12:37. Показов 3082. Ответов 38
Метки нет (Все метки)
Подскажите, как запихать в класс функцию потока (небольшой пример, если есть)?
когда пишу так:
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
|
10.11.2015, 12:37 | |
Ответы с готовыми решениями:
38
Создание потока в классе У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? По поводу потока и перегрузки оператора вставки в классе Перегрузка операторов ввода и вывода из потока в шаблонном классе |
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
10.11.2015, 12:53 | 2 |
Принцип можно срисовать отсюда: 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 | |||||
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
|
Неэпический
|
||||||
12.11.2015, 16:19 | 6 | |||||
Прототип функции:
1
|
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
|
|
12.11.2015, 16:26 [ТС] | 7 |
0
|
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
|
|
12.11.2015, 16:32 [ТС] | 9 |
спасибо, помогло, а еще
E2247 '__stdcall abc::ReadThread(void *)' is not accessible
0
|
Неэпический
|
|||||||||||
12.11.2015, 16:35 | 10 | ||||||||||
Ну и
в приведенном куске кода нет упоминания abc::ReadThread, так что только гадать что там.
1
|
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
|
||||||
12.11.2015, 16:41 [ТС] | 11 | |||||
как-то так
Да, сторонняя ошибка(
0
|
12.11.2015, 16:45 | 12 |
Очень не безопасно, объект может быть уже уничтожен, а поток может еще работать. В таких случаях класс наследует std::enable_shared_from_this<> и в поток передается shared_from_this(). Ну и конструкторы прячутся в private.
Добавлено через 1 минуту да и потоки можно использовать из C++11, либо enable_shared_from_this взять из boost'а, либо реализовать все это руками.
2
|
Неэпический
|
|
12.11.2015, 16:53 | 13 |
ну тогда
компилятор может не поддерживать c++11. Нам не ведано, что там и как у автора будет устроено, как будет синхронизироваться и т.д.
1
|
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
|
|
13.11.2015, 12:37 [ТС] | 14 |
Пишу код, который должен работать в VS13 и RadStudio XE8, думаю C++11 должны поддерживать.
А можно чуть подробнее (без boots)? Пример какой, а то так я не очень знаю что такое enable_shared_from_this<>
0
|
13.11.2015, 14:33 | 15 |
Хотел пример написать, но потом подумал - WinAPI это сишный стиль, в поток передается void*, т.е. максимум, что ты можешь туда передать это указатель на shared_ptr, но shared_ptr уже может быть уничтожен к моменту запуска потока. Поэтому тут так не получится, нужна другая реализация создания потоков.
В общем следи за тем, чтобы время жизни объекта было >= времени жизни потока.
1
|
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
|
|
13.11.2015, 14:49 | 16 |
все получится. в деструкторе объекта сигнализируем потоку, что пора на выход и делаем join.
1
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
13.11.2015, 15:51 | 18 |
Справедливости ради, std::thread через те же сишные функции реализован. Если ты ему join забудешь позвать, то будет та же самая картина: объект потока уничтожился, а сам поток еще работает.
1
|
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
|
|
13.11.2015, 15:53 | 19 |
1
|
13.11.2015, 15:55 | 20 | |||||
Я имел ввиду другое.
Добавлено через 51 секунду я внуть не смотрел, но подозреваю, что объект thread хранит в себе shared_ptr (или что ему передали) и он будет жить пока поток не завершится.
1
|
13.11.2015, 15:55 | |
13.11.2015, 15:55 | |
Помогаю со студенческими работами здесь
20
Как из потока управлять формой, если функции потока находятся в другом классе? Создание потока в классе Запуск потока в классе Статическая функция в классе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |