![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| artstalker |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
Если упростить пример, то есть допустим метод, который создаёт вторую форму, и во время своего выполнения прогрессбар на форме №2 растёт.
Форма 2 в таком случае зависает. Оно и понятно. Тогда я придумал такой способ: Form1:
Form2:
Можно ли сделать как-то проще? Это сообщение отредактировал(а) artstalker - 7.5.2009, 14:19 |
||||||
|
|||||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
поюзать BackgroundWorker?
-------------------- СУВ, Partizan. |
|||
|
||||
| artstalker |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
А как он может помочь? Ну кроме замены строчки
на
|
||||
|
|||||
| artstalker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
А вот если мне надо сделать наоборот. Допустим есть метод который долго выполняется и из этого метода мне нужно создать форму так чтобы она не зависала, т.е. в параллельном потоке. Т.е. что-то наподобие этого:
Но если так написать, то форма 2 зависнет, так как Method выполнится и поток закроется. Это сообщение отредактировал(а) artstalker - 7.5.2009, 18:20 |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Так, что он уже имеет всю синхронизацию с основным потоком. вот, смотри:
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| artstalker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
А как мне сделать наоборот? Есть выполняющийся поток и из него надо как-то создать форму в другом потоке.
|
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
имхо, не хорошо создавать форму из другого потока в первом потоке. К чему это? -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| artstalker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
Ну вот смотри. У меня есть фоновый поток, который работает постоянно. И когда в этом потоке происходят некоторые действия мне надо открыть форму, информирующую о выполнении, а затем при завершении этого поддействия - закрыть форму. Но поток продолжает работать постоянно.
Т.е. как-то надо вызвать форму из этого потока, но я как не пробовал, форма всегда виснет |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Если ты сделаешь через BackgroundWorker, то ты можешь оповещать основной поток о том или ином через метод ReportProgress.
Если без BackgroundWorker, тебе придется заняться синхронизацией с основным потоком самостоятельно. Приведу пример который был выше, адаптированный под твою задачу. 1. Убери из метода backgroundWorker1_RunWorkerCompleted две строчки закрытия progressForm. 2. Убери из btnStart_Click строчки создания progressForm. 3. Измени содержимое методов backgroundWorker1_DoWork и backgroundWorker1_ProgressChanged на следующее:
Форма с прогрессом будет показываться теперь каждые 5 сек. и выполнять свой прогрес по 10 сек., а затем закрываться и через 5 секс. опять. Так устроит? -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| artstalker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
Вот это то, что надо!
А ещё один вопрос. Как я могу передать информацию из формы в постоянно исполняющийся поток? Это сообщение отредактировал(а) artstalker - 8.5.2009, 20:05 |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Можно передать любой объект в метод RunWorkerAsync и получать его через e.Argument в методе DoWork. Если параметров много, то можно объявить структуру и передавать ее.
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| artstalker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 5.2.2009 Репутация: нет Всего: нет |
Мм, надо будет попробовать. Ещё раз спасибо. Это я так сказать теор. почву создаю. Всё руки не дойдут реализовать)
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |