|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
31.07.2011, 22:20 | #1 |
Форумчанин
Регистрация: 30.10.2010
Сообщений: 524
|
Потоки(TThread). Возврат значений функции.
Здраствуйте! Проблема такова: я имею класс, в котором есть много ф-й и результат ф-й заноситься в глобальную переменную. Когда я исполняю поток, то немогу взнать когда он закончит свою работу(или точнее не знаю как это проверить).
Вопрос такой: как это сделать? Пример кода: Код:
Код:
|
31.07.2011, 22:46 | #2 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Цитата:
Формально OnTerminate не есть факт завершения собственно поточной ф-ции, но это событие возбуждается после завершения работы метода TThread.Execute Последний раз редактировалось mss; 31.07.2011 в 22:48. |
|
31.07.2011, 22:47 | #3 |
Форумчанин
Регистрация: 30.10.2010
Сообщений: 524
|
А если об'єкт потока не будет уничтожаться а только Suspend?
|
31.07.2011, 23:08 | #4 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Цитата:
Это м.б. и штатный Synchronize (сфера его использования довольно специфична и ограничена) и иные объекты синхр-ции, начиная с CriticalSection и заканчивая глобальными объектами (Event, Mutex, Semaphore). Для гурманов и особо умудренных ОС предоставляет еще и объекты-файберы. |
|
01.08.2011, 12:44 | #5 |
Форумчанин
Регистрация: 13.12.2010
Сообщений: 603
|
Поток TThread считается завершенным, когда завершается выполнение его мето
да Execute(). В этот момент вызывается стандартная процедура Delphi End- Thread(), которая, в свою очередь, вызывает функцию API Win32 ExitThread(). Данная функция должным образом освобождает стек потока и сам объект потока API. По завершении ее работы поток перестает существовать и все использованные им ре сурсы будут освобождены. Код:
|
01.08.2011, 13:44 | #6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Код:
Вобще, логика должна быть примерно такая: 1) инициализируем поток, сбрасываем событие (ResetEvent) 2) запускаем поток, по завершению работы он должен установить событие (SetEvent) в сигнальное состояние 3) главный поток периодически смотрит на это событие (WaitForSingeObject), если оно установлено, считаем, что значение Globalresult определено. Вобще, идея с suspend/resume не очень, имхо. Проще действительно OnTerminate использовать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
01.08.2011, 18:47 | #7 | |
Форумчанин
Регистрация: 30.10.2010
Сообщений: 524
|
Цитата:
это просто сам на скорую написал код, т.е. приблизительный пример) Так что ошыбки могли быть, но дело не в этом. А так, спасибо всем за советы! |
|
07.08.2011, 13:07 | #8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
щас вот подумал, вместо suspend/resume, которые уже давно deprecated, на порядок лучше использовать такую схему: есть два события, одно сигнализирует о том, что для потока есть новая работа (EvNewJob), и второе, говорящее о том, что поток с работой справился (EvJobDone). Тогда схема будет такая:
дополнительный поток: Код:
Код:
У EvNewJob желательно ManualReset = False, или не забывать сбрасывать самому.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 07.08.2011 в 13:15. |
07.08.2011, 17:04 | #9 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
или вы имели в виду что подход через их использование устарел?(тогда согласен) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
07.08.2011, 18:46 | #10 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
из исходников Classes.pas из Delphi 2010:
Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Возврат значений из DLL в реальном времени | Alter | Общие вопросы Delphi | 5 | 21.06.2011 19:43 |
Возврат значения из класса TThread | Alter | Общие вопросы Delphi | 1 | 27.12.2010 21:48 |
Мини бэйсик:объявление функции, вызов функции , возврат. | AL_LORD | Помощь студентам | 2 | 14.10.2010 17:48 |
возврат значений - дерево | ArniLand | Общие вопросы по Java, Java SE, Kotlin | 3 | 23.09.2010 11:17 |
Возврат массива значений в функцию main. | sadf | Общие вопросы C/C++ | 5 | 03.03.2010 21:32 |