Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
i386
3 / 3 / 2
Регистрация: 08.04.2011
Сообщений: 23
1

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается

07.08.2014, 14:07. Просмотров 979. Ответов 6
Метки нет (Все метки)

Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не освобождается от пойнтера. У меня конечно есть вариант посылать сообщение главному потоку через PostMsg, но может есть еще какие варианты, не использовать же таймер для проверки
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2014, 14:07
Ответы с готовыми решениями:

Разработать программу, в которой основной поток, принимает поток ввода и контролирует созданные потоки.
что-то не-то с кодом. 2 дня ломаю голову :( //#define _REENTRANT #include <stdio.h> #include...

Не очищается поток ввода
Ребят,у меня не очищается поток ввода,и не вводится фамилия студента(сразу перескакивает на группу...

Не очищается поток после cin.clear()
Собственно есть программа записывающая данные в файл и считывающая их оттудова со всеми...

Глобальная переменная и поток
Здравствуйте. Пишу сниффер. В переменной isWorking хранится состояние сниффера - работает он или...

Поток был недоступен для чтения
Здравствуйте. Что то пошло не так: HttpWebRequest wr =...

6
northener
пофигист широкого профиля
3637 / 2441 / 660
Регистрация: 15.07.2013
Сообщений: 14,551
07.08.2014, 14:11 2
Переменные содержащие ссылки на экземпляры любых классов в т.ч. потоков можно очистить только ручками. Других вариантов нет и быть не может в принципе.
0
DenNik
Непрофессионал
2303 / 1932 / 326
Регистрация: 26.07.2011
Сообщений: 8,953
Записей в блоге: 1
07.08.2014, 17:01 3
Цитата Сообщение от i386 Посмотреть сообщение
У меня конечно есть вариант посылать сообщение главному потоку через PostMsg
главный поток узнает о завершении работы доп.потока при обработке его события OnTerminate. мне кажется, об этом в любом уроке пишут
0
mss
2640 / 2264 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
07.08.2014, 23:33 4
Цитата Сообщение от i386 Посмотреть сообщение
переменной..не освобождается от пойнтера
А зачем вообще понадобилась эта переменная, если FreeOnTerminate:=True ?
0
i386
3 / 3 / 2
Регистрация: 08.04.2011
Сообщений: 23
08.08.2014, 19:55  [ТС] 5
Цитата Сообщение от mss Посмотреть сообщение
А зачем вообще понадобилась эта переменная, если FreeOnTerminate:=True ?
А зачем вообще используется переменная? Для этого и есть...
0
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
08.08.2014, 20:21 6
Цитата Сообщение от i386 Посмотреть сообщение
А зачем вообще используется переменная?
действительно, зачем?

Цитата Сообщение от i386 Посмотреть сообщение
Поток освобождается, но переменной которой было присвоен этот поток, не освобождается
переменная типа TObject (TThread тоже оттуда, все оттуда) является по своей сути указателем на память, где содержится экземпляр класса, при разрушении экземпляра память освобождается, но переменная все равно имеет значение, только указывающее уже на "неправильную" память (см. различие Free и FreeAndNil)
в вашем случае, как уже указывали тов. DenNik и mss переменная как указатель на экземпляр класса вообще не нужна:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
with TMyThread.Create(true) do
begin
   FreeOnTerminate := true;
   OnTerminate := MyTerminateThreadProc;
   Resume;
end;
 
procedure TMyForm.MyTerminateThreadProc(Sender: TObject);
begin
// в Sender поток, который закончил работу
   MessageBox(Handle, 'Поток закончил работу','', MB_OK);
end;
0
northener
пофигист широкого профиля
3637 / 2441 / 660
Регистрация: 15.07.2013
Сообщений: 14,551
09.08.2014, 02:21 7
Цитата Сообщение от i386 Посмотреть сообщение
А зачем вообще используется переменная? Для этого и есть...
Глупый ответ.
Или это вопрос троешника? Тогда читай учебники.
0
09.08.2014, 02:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2014, 02:21

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся.
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка...

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в...

OpenFileDialog и потоки: Текущий поток должен быть задан как поток однопоточного контейнера (STA)
Со стартового окна запускаю формы вот так: new Thread(() => { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.