![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| zss |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
что-то никак не пойму где косяк
*.h
*.cpp
и тогда если
то слетает при втором проходе цикла и мой компилятор говорит, что не освобождены ресурсы. Где косяк ? |
||||||
|
|||||||
| threef |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Я не знаю, чего ты хотел, может так ?
Наверное, при попытке создать поток внутри цикла в локальной переменной у тебя уничтожается эта переменная, чему мешает и Sleep и WaitForSingleObject |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
да нет - именно локальный объект (у меня установлен AutoTerminate - тоесть поток сам отомрет как только закончит выполнение) ошибку подсказали - при вызове деструктора иничтожается объект caller_. А когда поток запускается, то естественно бызывает caller_->Call() для несуществующего объекта но как это победить ? (я имею ввиду запрет вызова Call(), если объект убит) ведь это статическая функция. А как привязать к этому хозяйству синхронизацию - никак не пойму |
|||
|
||||
| threef |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
У меня синтаксис обьявления Thread не прошел, поэтому я
поменял:
и перенес в cpp:
Компилится и работает ok ms 6.0 |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
threef, это временный эфект (если ты конечно не через new создаешь объекты) - попробуй увеличь число циклов - рано или поздно должно слететь
Добавлено @ 22:00 странно - стандарт С++ позволяет статически целочисленные константы инициализировать в заголовочном файле ... Это сообщение отредактировал(а) zss - 16.2.2006, 22:01 |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Не полностью разобрал, потому как читать твою программу- одно удовольствие, не читать - другое. Судя по всему, главный поток процесса не дает возможности отработать новым потокам связывание с виртуальной таблицей. Может, до момента удаления обьекта стоит придержать главный поток Suspend-ом ? Потому как лечится просто :
Насчет синхронизации, попробовал привинтить критическую секцию к деструктору - не удалось |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
А в чем задача-то ?
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Если я правильно поняла, то в цикле
проблема в том, что локальная переменная может быть уничтожена раньше, чем поток на самом деле стартовал. Так? Тогда выход в том, чтобы не выходить их метода Start до того как стартует потоковая функция. Достигнуть этого просто: событие, которого ждешь в функции Start перед тем как выйти. А событие сигналится из функции потока - когда ей уже передано управление. Достаточно частая ситуация, кстати: запускают поток и сразу начинают что-нибудь делать в основном, считая, что раз "start" вызван, то поток действительно стартовал... -------------------- ... |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
даже если она стартует - это ничего не изменит. Потоковая функция может прерватся, в тот момент когда объект умрет - и если поток проснется - косяк. На сколько я понял - если это объект поток - то он должен жить не менее чем сам поток. Единственное что можно сделать - убивать объект из самого потока, но тогда нельзя самому вызывать деструктор (правда непонятно как это сделать |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |