Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2014, 22:30   #1
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
Вопрос Освободить память после потока

Hello! Ребят, такой вопрос:
Как освободить память, после завершения работы потока?
Вот код создания и приостановки потока, и то и другое осуществляется путем изменения State у CheckBox
Код:
procedure TForm1.CheckBox_NUM1Click(Sender: TObject);
begin
case CheckBox_NUM1.State of
    cbUnchecked:
      begin
        num1.Suspend;
        num1.Terminate;
      end;
    cbChecked:
      begin
        num1 := send_num1.Create(False);
      end;
  end;
end;
Вот код процедуры выполнения потока:
Код:
procedure send_num1.Execute;
begin
  while True do
    begin
      PostMessage(mHandle, WM_KEYDOWN, $00000061, $004F0001);
        Sleep(10);
      PostMessage(mHandle, WM_KEYUP, $00000061, $C04F0001);
      Sleep(StrToInt(Form1.Edit_num1.Text));
    end;
end;
Суть, более точнее: Запуская поток, к используемой памяти программы, накидывается 32-34 кб, при выключении (точнее при приостановке) работы потока, память не изменяется, при повторном запуске, еще +32-34 кб. В прицепе, ясно то, что Terminate не убивает, и не освобождает ресурсы потока. Так вот вопрос, как это дело исправить?
P.s. пробовал WaitFor & Free но программа зависает, пока, не осилю в чем беда, Help.
SPLER вне форума Ответить с цитированием
Старый 05.06.2014, 22:32   #2
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Код:
procedure send_num1.Execute;
begin
  FreeOnTerminate := True;

  while True do
    begin
      PostMessage(mHandle, WM_KEYDOWN, $00000061, $004F0001);
        Sleep(10);
      PostMessage(mHandle, WM_KEYUP, $00000061, $C04F0001);
      Sleep(StrToInt(Form1.Edit_num1.Text));
    end;
end;
Lardes вне форума Ответить с цитированием
Старый 05.06.2014, 22:53   #3
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Благодарю, сейчас испробую.
SPLER вне форума Ответить с цитированием
Старый 05.06.2014, 22:58   #4
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Не помогло, после повторного запуска, так же +~30 кб.
SPLER вне форума Ответить с цитированием
Старый 05.06.2014, 23:02   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

а Terminated кто в цикле потока проверять будет? Terminate поток не прекращает, а только этому самому Terminated True присваивает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2014, 23:23   #6
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Я в курсе про Terminated, краткий пример можно нет? то что if.. lalala, ясно, но по сути, если приостанавливать поток, то и цикл прекращает работу, или вы имеете в виду отдельный поток?
SPLER вне форума Ответить с цитированием
Старый 06.06.2014, 00:43   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
procedure send_num1.Execute;
begin
  FreeOnTerminate := True;

  while not Terminated do
    begin
      PostMessage(mHandle, WM_KEYDOWN, $00000061, $004F0001);
        Sleep(10);
      PostMessage(mHandle, WM_KEYUP, $00000061, $C04F0001);
      Sleep(StrToInt(Form1.Edit_num1.Text));
    end;
end;
для завершения вызываем
Код:
num1.Terminate();
но имейте в виду что приложение может не вернуть память системе, а например след потом в том же месте будет создан.
но утечки не будет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.06.2014, 02:08   #8
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Пепел Феникса, работает превосходно, спасибо. Вопрос решен. Так же благодарю тех, кто принял участие в решении вопроса.
SPLER вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освободить память формы st_yak C++ Builder 0 21.12.2013 19:56
выполнить действие после завершения потока Pein95 Общие вопросы Delphi 3 23.11.2011 13:52
Освободить память от CEdit Eros Общие вопросы C/C++ 0 29.11.2010 15:37
Что вызывется после Execute у потока? TwiX Общие вопросы Delphi 6 06.05.2010 02:03
Использование метода free после завершения потока Denager Общие вопросы Delphi 4 29.08.2008 10:13