![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Всем привет. Первый раз пользую потоки
Все работает, потоки - сила. Но вот столкнулся с такой проблемой, поток пошел в execute, все пашет, жму кнопку, делаеться Terminate указанного потока. Удаляю данные из ячейки, и меня в ошибку выкидывает. А выкидывает потому что поток еще не Terminate, а где то TCopyThread.Progress шатаеться... Ну и я тут в ступоре, как сделать так, что бы дождаться его Terminate ? Так пробывал:
Не помогает :( Тока с примером, если можно, а то для меня потоки это темный лес |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 14 Всего: 115 |
Ну если не вешать всяких своих проверок то по пришествию события OnTerminate. А так по сути проблемы не мешало бы код увидеть ... Это сообщение отредактировал(а) RA - 6.1.2010, 16:12 |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 6 Всего: 64 |
ZBugz, вызов метода Terminate не уничтожает поток, а лишь взводит флаг Terminated, который нужно проверять в потоке и если он взведён, завершать его работу.
Ну а проверить завершился ли поток можно функцией GetExitCodeThread. В lpExitCode заносится код завершения потока либо STILL_ACTIVE, если поток ещё работает. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
ZBugz,
В реализации Delphi есть метод WaitFor для ожидания завершения поточной функции. Использовать можно в случае FreeOnTerminate=False; т.е.
Если нужна периодическая проверка, тогда можно периодически проверять результат функции
-------------------- |
||||
|
|||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Народ, я ничего не понял вообще
Код выложить пока не могу, негде написать пример... |
|||
|
||||
| ZBugz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
А в проекте так:
И вот где брейк, что то надо делать, что бы ждать когда он завершиться....
Добавлено через 1 минуту и 12 секунд Нажимаею кнопку и передаю
Где idx номер потока котрый грохнуть |
||||||
|
|||||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 6 Всего: 64 |
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| ZBugz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Так все удаляю, ща вот точнее как у меняя там:
То что free не срабатывает, это я понял давно, точнее он то срабатывает, а поток в это время гуляет TCopyThread.Progress Мне бы как то это бы отловить бы, что пока он не завершиться, free не делать... |
||||||
|
|||||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 6 Всего: 64 |
Вы что, пытаетесь уничтожить поток внутри него же? ИМХО у вас вообще организация неправильная. Что вы хотите сделать вообще? Какова цель? -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| ZBugz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Не обращайте внимания, это я для примера так написал. Я смысл хотел передать, что Terminated в Execute срабатывает, в finally выходит вроде, все делаеться, но на самом деле он не звершен И еще, я не знаю, поможет или нет, но когда только создаю поток, он успешно рубиться в Execute, а все синхронайзы(Progress), т.е. вывода информации, как то сначала запаздуют с отображением, а то ка потом вся инфа идет. И точно так же получаеться что он и выходит их Execute Мне бы какой нить цикл, который ждал бы завершения именно этого потока, а потом уже вываливался в тот же
Добавлено через 1 минуту и 23 секунды
Кстати, а почему это не прокатит ? Поток потоком, а stream - стримом. Они же не пересекаються никаким способом.... ?! |
||||||
|
|||||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 6 Всего: 64 |
Terminated - это флаг, который взводится при вызове метода потока Terminate. При проверке этого флага внутри Execute, можно убраться за собой и выйти из функции (хотя можно и проигнорировать флаг ИМХО это из-за синхронизации. Ох. Сори. Я что-то подумал, что это объект потока. Добавлено через 1 минуту и 3 секунды А где вы создаёте Stream? -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| ZBugz |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Так вот, я делаю все, а оно делаеться, но с опозданием. Т.е. все работает, в 99%, а в оставшемся случае, тупо не успевает уничтажаться. Добавлено @ 21:19
Прям в Execute. Вроде как одно другому не мешает Это сообщение отредактировал(а) ZBugz - 8.1.2010, 21:20 |
||||
|
|||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 6 Всего: 64 |
Так и уничтожайте там же. После проверки флага Terminated, уничтожте и выходите из функции. Или Stream в это время ещё нужна? Добавлено через 4 минуты и 21 секунду
задержку при старте можно объяснить синхронизацией ИМХО, а вот по поводу того что у вас в конце там тормозит, я так и не понял толком Ага. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| ZBugz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Не, не нужна. Я ее там же и уничтажаю. Выше в код е написанно, что грохаю все.
|
||||||
|
|||||||
| artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 6 Всего: 64 |
эм... не верю Добавлено через 4 минуты и 57 секунд Т.е. вы хотите сказать, что это работает:
, а Stream уже уничтожен? Добавлено через 6 минут и 25 секунд Кстати, у вас в коде проверка Terminated стоит в самом конце. Там от неё толку нет Это сообщение отредактировал(а) artsb - 9.1.2010, 10:12 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |