2 / 2 / 0
Регистрация: 13.08.2021
Сообщений: 40
|
|||||||||||
1 | |||||||||||
Получение ID потока объектов TThread17.02.2022, 13:36. Показов 1369. Ответов 4
Метки нет (Все метки)
Возможно, я просто плохо разобрался в теме с векторами, но в теории моя программа должна работать. Видимо, я просто не до конца понимаю работу итераторов контейнеров stl.
Проблема вот в чём. Есть класс, который хранит список существующих потоков. В нём есть вектор, хранящий указатели на эти объекты:
[bcc32 Error] ThreadQueue.cpp(18): E2062 Invalid indirection Full parser context ThreadQueue.cpp(15): parsing: void ThreadQueue::Erase(unsigned int) Видимо, проблема в неправильном разыменовании указателя. Здесь оно двойное. Разыменовывать один раз пробовал, помощник кода в таком случае вообще не мог найти функцию ThreadID, да и вообще ни одной функции не нашёл. А при двойном разыменовании функция находится, но выскакивает такая ошибка. Но в чём может быть проблема? Ведь разыменовывая итератор, я по сути дела получаю указатель, который при работе с объектами разыменовывать нет необходимости, если я хочу обратиться к методам этого объекта. Как можно решить эту проблему? P.s. и вопрос не по теме. Есть какие-либо другие способы оптимизации функции удаления? Без перебора всех объектов и экономии ресурсов компьютера. Хотя, возможно, в этом нет никакой необходимости, но было бы интересно посмотреть на другие варинты
0
|
17.02.2022, 13:36 | |
Ответы с готовыми решениями:
4
Дождаться завершения потока TThread Определить состояние потока TThread Реализация на базе TThread потока с timeout'ом Корректное освобождение памяти при принудительном завершении потока TThread |
Супер-модератор
|
|||||||||||
17.02.2022, 16:50 | 2 | ||||||||||
По идее (в нормальной реализации C++) можно было бы сделать так:
1
|
2 / 2 / 0
Регистрация: 13.08.2021
Сообщений: 40
|
|
18.02.2022, 00:01 [ТС] | 3 |
И ни один в моей версии Билдера не работает) использую версию 10.4, вроде не такая уж и старая.
Компилятор выдаёт такую ошибку: [bcc32 Error] ThreadQueue.cpp(17): E2316 'remove_if' is not a member of 'std' Возможно, придётся искать нужные методы и отдельно разбираться в библиотеке stl, пробуя разные варианты
0
|
Супер-модератор
|
||||||
18.02.2022, 00:16 | 4 | |||||
1
|
2 / 2 / 0
Регистрация: 13.08.2021
Сообщений: 40
|
||||||||||||||||
18.02.2022, 23:13 [ТС] | 5 | |||||||||||||||
Инклюда не было) подозревал, что может быть проблема именно в неподключенной библиотеке, но не смог найти эту информацию в интернете. Хотя может быть плохо искал. Сейчас то уже вижу список всех этих функций и среди них та, которую вы привели в пример - remove_if.
Но теперь другая проблема - компилятор жалуется на begin и end в аргументах remove_if. Пришлось вызывать их как функции непосредственно через контейнер, то есть через обращение к его методам, а не как передача в качестве аргумента в саму функцию begin или end. То есть так:
P.s. Эх, придётся опять учить всю эту stl и весь этот новый и непривычный синтаксис с лямбда фунциями... Добавлено через 2 минуты И вообще, использование глобальных переменных - плохой стиль. Хотелось бы от него избавиться, вот только не знаю как. Либо другая функция, либо каким-то другим нетривиальным способом можно сравнивать её в функции Equals. Нужно будет поискать информацию и подумать. Благодарю за наводку
0
|
18.02.2022, 23:13 | |
18.02.2022, 23:13 | |
Помогаю со студенческими работами здесь
5
ShellExecute из потока Tthread Как правильно получить данные от потока TThread? Как получить доступ к методу TThread из основного потока? Не могу создать Ole объект при создании нового потока TThread Создать два потока: первый - средствами Windows API, второй - с использованием класса TThread Получение значений свойств объектов класса в векторе этих объектов Получение значений из потока Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |