Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по TThread 
V
    Опции темы
Viy_2007
Дата 8.2.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Доброго времени суток.
Вопрос заключается в следующем: у класса TThread есть метод Suspend и Resume которые приостанавливают и возобновляют выполнение потока соответственно, а как сделать так чтобы поток после остановки и возобновления работы начал выполняться с первой строчки тела потока, а не с того места где он был приостановлен благодаря методу Suspend? Вообщем необходимо перезапустить поток...
Всем заранее спасибо.

ЗЫ. Сразу отмечу, что способ типа "пересоздать поток" не подходит...

Это сообщение отредактировал(а) Viy_2007 - 8.2.2008, 00:57
PM MAIL   Вверх
EvilsInterrupt
Дата 8.2.2008, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Viy_2007, Такое чувство, что ты не правильно проектируешь выполнение кода в трэде. Приведи саму задачи из-за чего тебе так нужно, чтобы выполнение шло с первой строчки трэда? А вообще на прашивается убить экземпляр класса и создать заново ;)
PM MAIL WWW ICQ Jabber   Вверх
Viy_2007
Дата 10.2.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Проблема собственно заключается в следующем: я использую множество потоков (TThread, порядка 100 штук), в каждом из них есть свой объект типа TIdTCPClient. Так вот, на протяжении работы всей программы эти потоки постоянно пересоздаются, и в какой-то момент происходит переполнение памяти и получаем ошибку "Thread creation error: недостаточно памяти...". Что б не пробовал, освободить память не получается, хотя все объекты в потоках освобождаются, да и сами потоки разрушаются... Вот как вариант и задал этот вопрос, чтобы не пересоздавать постоянно потоки, а просто перезапускать...

ЗЫ. Может кто знает в чем может заключаться этот прикол? Сначала я думал что из-за резеривирования ОС памяти под потоки, поэтому написал своё подобие TThread где в функции BeginThread жёстко указал размер выделяемой памяти под стек, но ситуация не изменилась. Есть ещё вариант что это проблема именно с TIdTCPClient, а точнее с сокетами в винде в вообщем, но об этом мне мало что известно... Так что если кто что может сказать по этому поводу, отписывайтесь...
PM MAIL   Вверх
MetalFan
Дата 10.2.2008, 10:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



1. MS не рекомендует использовать Suspend/Resume Thread для синхронизации.
Цитата(MSDN)
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization.


2. для достижения необходимого эффекта нужно использовать объекты синхронизации (см.SyncObj)



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Rennigth
Дата 10.2.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Цитата(Viy_2007 @  10.2.2008,  01:08 Найти цитируемый пост)
Есть ещё вариант что это проблема именно с TIdTCPClient

Ну а попробовать без них религия не позволяет? В индейцах глюки есть, и их немало находили :(.  А так хз... я писал приложение которое в котором работало от 80 до 120 потоков, и таких проблем небыло, значит косяк или у тебя или в индейцах.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Viy_2007
Дата 10.2.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Оказалось что всё таки в освобождении потока был баг (по крайней мере я надеюсь что только здесь), точнее в флаге FreeOnTerminate. Почему то при установке его в true и вызове метода Terminate осовобождение памяти так и не происходило... Поставил комбинацию Terminate и Free и всё пошло как по маслу, для идеальных условий.
А теперь вопрос: если в конце каждого из потоков стоит функция PostMessage благодаря которой я узнаю что поток закончил свою работу, путём отправки сообщения главной форме, где поставить Terminate, а где Free? Пробовал поставить после PostMessage - Terminate, а уже при приёме сообщения Free, но это не помогло, память так и не освободилась...
И ещё, как мгновенно разрушить поток с освобождением ресурсов? Функция TerminateThread не дала нужного результата, вроде бы поток и разрушается, но память всё равно за ним остаётся...

Цитата

1. MS не рекомендует использовать Suspend/Resume Thread для синхронизации.Цитата(MSDN)
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization.



2. для достижения необходимого эффекта нужно использовать объекты синхронизации (см.SyncObj)


не понял, к чему это было...
PM MAIL   Вверх
Viy_2007
Дата 22.2.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Вообщем решил проблему созданием ещё одного потока который контролирует остальные и в нужный момент делает обход и разрушает их. Тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.