![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Viy_2007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 27.11.2007 Репутация: нет Всего: нет |
Доброго времени суток.
Вопрос заключается в следующем: у класса TThread есть метод Suspend и Resume которые приостанавливают и возобновляют выполнение потока соответственно, а как сделать так чтобы поток после остановки и возобновления работы начал выполняться с первой строчки тела потока, а не с того места где он был приостановлен благодаря методу Suspend? Вообщем необходимо перезапустить поток... Всем заранее спасибо. ЗЫ. Сразу отмечу, что способ типа "пересоздать поток" не подходит... Это сообщение отредактировал(а) Viy_2007 - 8.2.2008, 00:57 |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 1 Всего: 9 |
Viy_2007, Такое чувство, что ты не правильно проектируешь выполнение кода в трэде. Приведи саму задачи из-за чего тебе так нужно, чтобы выполнение шло с первой строчки трэда? А вообще на прашивается убить экземпляр класса и создать заново ;)
|
|||
|
||||
| Viy_2007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 27.11.2007 Репутация: нет Всего: нет |
Проблема собственно заключается в следующем: я использую множество потоков (TThread, порядка 100 штук), в каждом из них есть свой объект типа TIdTCPClient. Так вот, на протяжении работы всей программы эти потоки постоянно пересоздаются, и в какой-то момент происходит переполнение памяти и получаем ошибку "Thread creation error: недостаточно памяти...". Что б не пробовал, освободить память не получается, хотя все объекты в потоках освобождаются, да и сами потоки разрушаются... Вот как вариант и задал этот вопрос, чтобы не пересоздавать постоянно потоки, а просто перезапускать...
ЗЫ. Может кто знает в чем может заключаться этот прикол? Сначала я думал что из-за резеривирования ОС памяти под потоки, поэтому написал своё подобие TThread где в функции BeginThread жёстко указал размер выделяемой памяти под стек, но ситуация не изменилась. Есть ещё вариант что это проблема именно с TIdTCPClient, а точнее с сокетами в винде в вообщем, но об этом мне мало что известно... Так что если кто что может сказать по этому поводу, отписывайтесь... |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
1. MS не рекомендует использовать Suspend/Resume Thread для синхронизации.
2. для достижения необходимого эффекта нужно использовать объекты синхронизации (см.SyncObj) -------------------- There are always someone smarter than you... |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Ну а попробовать без них религия не позволяет? В индейцах глюки есть, и их немало находили :(. А так хз... я писал приложение которое в котором работало от 80 до 120 потоков, и таких проблем небыло, значит косяк или у тебя или в индейцах. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Viy_2007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 27.11.2007 Репутация: нет Всего: нет |
Оказалось что всё таки в освобождении потока был баг (по крайней мере я надеюсь что только здесь), точнее в флаге FreeOnTerminate. Почему то при установке его в true и вызове метода Terminate осовобождение памяти так и не происходило... Поставил комбинацию Terminate и Free и всё пошло как по маслу, для идеальных условий.
А теперь вопрос: если в конце каждого из потоков стоит функция PostMessage благодаря которой я узнаю что поток закончил свою работу, путём отправки сообщения главной форме, где поставить Terminate, а где Free? Пробовал поставить после PostMessage - Terminate, а уже при приёме сообщения Free, но это не помогло, память так и не освободилась... И ещё, как мгновенно разрушить поток с освобождением ресурсов? Функция TerminateThread не дала нужного результата, вроде бы поток и разрушается, но память всё равно за ним остаётся...
не понял, к чему это было... |
|||
|
||||
| Viy_2007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 27.11.2007 Репутация: нет Всего: нет |
Вообщем решил проблему созданием ещё одного потока который контролирует остальные и в нужный момент делает обход и разрушает их. Тема закрыта.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |