Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 6

Многопотоковое приложение - ткнуть пальцем на ошибку

26.04.2013, 19:01. Показов 1307. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Короче, при запуске приложения стартует таймер, по событию которого создается поток. Далее таймер снова активирует себя и назначает другой Interval из диапазона (диапазон выбран чтобы удобно было визуально наблюдать за процессом...). Ссылки на поток записываются в переменную типа TList (методом Add). Мне в дальнейшем надо будет иметь к ним доступ через этот список.

Теперь о самом потоке.
В методе Execute выполняются какие-то действия (из примера я их убрал, но там никаких конфликтов или дэдлоков не может быть - просто бесконечный цикл с проверкой на Terminated). При создании потока создается таймер, по событию которого выдается команда Terminate для потока. Есть также обработчик OnTerminate, в котором я ОЧЕНЬ ХОЧУ вручную освобождать объект потока. И тут начинается самое интересное.
Если FreeOnTerminate = True (и вручную я не освобождаю объект), то всё нормально работает, но если поставить FreeOnTerminate = False, то внутри обработчика OnTerminate при попытке освобождения зависает всё.

Вопрос не в том как сделать по-другому, а ПОЧЕМУ ЗАВИСАЕТ???

PS в ходе написания обнаружилась еще одна проблема - при долгой работе потоки начали быстрее создаваться, чем уничтожаются те, которые уже отработали. А должно сохраняться примерное равенство работающих потоков...
Но это не главный вопрос...
Вложения
Тип файла: rar SM.rar (164.4 Кб, 5 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2013, 19:01
Ответы с готовыми решениями:

Первое многопотоковое приложение
Доброго времени суток, Миряне! решил начать осваивать создание многопотоковых приложений, ибо большо смотреть как мой "Hello...

Как создать многопотоковое прокси приложение?
1)Подключаться к прекси ир логин пароль порт каждый отдельный поток 2) открывает урл и находиться там 60 сек 3)повторить п1-п2 без...

Ребят, не могу найти ошибку в цикле, тыкните пальцем
Вот мой скромный код. Вычислить с точностью до е=0.0001. Выдаёт OverFlow Public Function factorial(n) Dim i factorial =...

3
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.04.2013, 22:52
Цитата Сообщение от alex_mora Посмотреть сообщение
внутри обработчика OnTerminate при попытке освобождения
Это недопустимо.
0
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 6
27.04.2013, 01:11  [ТС]
Вот цитата из книги Пачеко:
"Объект TThread поддерживает также событие OnTerminate, которое происходит
при завершении работы потока. Допускается освобождения объекта TThread внутри
обработчика этого события."
Я склонен верить этому автору. Да и потом, "Событие OnTerminate объекта TThread вызывается в контексте основного потока
приложения."... Это еще одно тому подтверждение, что можно освобождать таким способом.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.04.2013, 19:31
Цитата Сообщение от alex_mora Посмотреть сообщение
Я склонен верить этому автору
Ты вправе верить кому угодно, коть черту лысому, но факты неумолимы:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//фрагмент из оригинальных исх.текстов в составе Delphi7:
 
function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
...
  try
    if not Thread.Terminated then
    try
      Thread.Execute;
    except
      Thread.FFatalException := AcquireExceptionObject;
    end;
  finally
    FreeThread := Thread.FFreeOnTerminate;
    Result := Thread.FReturnValue;
    Thread.DoTerminate; // здесь осуществляется вызов обработчика OnTerminate в контексте осн.потока
    Thread.FFinished := True; // Thread - поле уже НЕСУЩЕСТВУЮЩЕГО объекта, который Пачеко разрешил тебе уничтожить строчкой выше. 
    SignalSyncEvent;
    if FreeThread then Thread.Free;
...
    EndThread(Result);
...
...
  end;
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2013, 19:31
Помогаю со студенческими работами здесь

Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку
Здравствуйте. Подскажите. что не так? Задача: Вывести на экран ПРОСТЫЕ ЧИСЛА в указанном диапазоне. Делала так: ...

Приложение обои - Сделать выплывающее меню при "чиркании" пальцем
Доброго времени суток! Суть проблемы такова: Обучаюсь разработке под Андроид. Естественно начал с изучения Java и еще параллельно...

Многопотоковое программирование на VB
Может кто знает как создавать многопотоковые приложения, просветите незнающего. Спасибо заранее.

Многопотоковое умножение матриц C#
Программа ниже производит умножение двух матриц. Нужно изменить ее, реализовав многопоточность (threads), чтобы каждому умножению строки на...

ткните пальцем
хочу написать метод класса для использования которого не было бы обязательным наличие хотя бы одного объекта этого класса. т.е. вместо...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru