Страница: 1 | 2 |
Вопрос: как дождаться окончания потока?
Добавлено: 18.06.08 21:46
Автор вопроса: __Pavel__ | Web-сайт:
есть поток:
thr.Start(_Parameters)
...
MsgBox("Поток закончен")
как сделать так чтоб программа не продолжила работу дальше? т.е. как сделать так чтоб сообщение показалось после завершения потока, а не после его начала?
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Holsten
Вопросов: 5
Ответов: 100
Профиль | | #1
Добавлено: 18.06.08 22:18
WaitForSingleObject
Номер ответа: 2
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #2
Добавлено: 19.06.08 09:31
Отказаться от использования потока! ))
Ты противоречишь основной сути потока! Его используют в тех случаях, когда необходимо выполнить какую то работу ассинхронно.. т.е. независимо от действий основного потока. Если же ты хочешь узнать момент окончания работы потока, то просто реализуй какое то событие внутри потока и подпишись на него там, где это нужно и выполняй какие то действия по этому событию..
Номер ответа: 3
Автор ответа:
Виталик
Вопросов: 4
Ответов: 4
Профиль | | #3
Добавлено: 19.06.08 12:10
схематично:
-Создаешь Thread A.
Код TreadA:
[создать Thread B]
WaitForSingleObject(ThreadB.id)
Msgbox("Поток закончен"
Номер ответа: 4
Автор ответа:
__Pavel__
Вопросов: 29
Ответов: 284
Web-сайт:
Профиль | | #4
Добавлено: 19.06.08 15:45
у меня есть поток... да я его использую для того чтоб не зависала форма... но при загрузке формы он должен сработать, а после его нужно выполнить еще одно действие, именно после... вот для чего это нужно
еще вопрос есть ли какойнибудь способ по проще, чем передавать данные из потока в контрол на форме с помощью делегатов?
Номер ответа: 5
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #5
Добавлено: 19.06.08 16:03
Используй BackgroundWorker там уже есть реализация событий, в частности ProgressChanged. передать данные контролу формы, тобишь обратиться к нему, можно только в том потоке в котором он создан. Поэтому без делегатов не обойтись
Номер ответа: 6
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #6
Добавлено: 19.06.08 20:58
Способ есть... Можно отключить проверку на Cross-Thread, но это криво.. В 90% случаях это отработает без ошибок, а в остальных получишь дедлок. Так что делегаты - это вполне нормальное решение.
Еще, как вариант, можно заюзать AsyncOperation но там по сути тоже самое...
Ну и в чем проблема? Создай событие, и в конце работы потока инициируй его. Далее в форме подпишись на него, и как это событие сработает делай что тебе нужно со своей программой все, что угодно..
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 21.06.08 16:23
> просто реализуй какое то событие внутри потока и подпишись на него там, где это нужно и выполняй какие то действия по этому событию..
Это событие будет отрабатывать в том же потоке который его и вызвал.
Номер ответа: 8
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #8
Добавлено: 21.06.08 17:02
Ну и что с того? А подписаться на него ты можешь в каком угодно месте и в каком угодно потоке..
Номер ответа: 9
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #9
Добавлено: 21.06.08 22:14
Ну я так понимаю автор вопроса хочет словить завершение потока из другого потока
Номер ответа: 10
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #10
Добавлено: 22.06.08 19:55
хм... перечитала топик... И с чего ты это взял?
Номер ответа: 11
Автор ответа:
Holsten
Вопросов: 5
Ответов: 100
Профиль | | #11
Добавлено: 22.06.08 20:16
По-моему, совершенно ясно, что автор хочет заморозить выполнение основного потока до момента завершения вторичного. Жаль что объект Thread в .NET не имеет открытого хендла. Было бы проще.
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 01.07.08 19:40
чем проще? Через ManualResetEvent все элементарно делается, вопрос в том ЗАЧЕМ?
Номер ответа: 13
Автор ответа:
__Pavel__
Вопросов: 29
Ответов: 284
Web-сайт:
Профиль | | #13
Добавлено: 06.07.08 00:22
сделал по другому... тема закрыта!
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 06.07.08 02:12
Расскажи как сделал?
Номер ответа: 15
Автор ответа:
__Pavel__
Вопросов: 29
Ответов: 284
Web-сайт:
Профиль | | #15
Добавлено: 06.07.08 13:48
этот поток генерировал ключ... при загрузке формы нужно было сгенерировать ключ а потом применить его... я сделал проще я сразу через код его вписал... типа стандартный