| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Cross-Threading |
| Автор: VisualProgrammerNET 19.3.2006, 21:56 | ||||
| Суть басни: создаю поток а-ля
метод MyVoid в свою очередь обращается к Label на форме и меняет там значение Text. Но приложение работать не будет, ибо
использовать нельзя. Вопрос. Как это сделать? Пробовал совать в разные места кода lock {}, но так ничего и не добился... |
| Автор: mr.DUDA 19.3.2006, 22:43 |
| Есть такой метод, называется Control.Invoke... Принимает делегат на любой метод, и вызывает этот метод в GUI-потоке приложения. Есть ещё свойство Control.InvokeRequired - возвращает true, если вызвающий его код работает не в GUI-потоке. |
| Автор: Wanderer2019 19.3.2006, 22:47 |
| тоже пытался разобраться. Особенно на 2005 вообще со всем этим делом жесть! Там появился какой то инструмент работы с потоками. Как работает тоже не понял. Но на первый взгляд так делать надо так. Напрямую работать с контролами нельзя. Необходимо работать через дополнительные функции. Т.е. из потока вызываем функцию, которая в свою очередь обращается к свойствам контрола. Вообщем присоединяюсь к вопросу =) Хотя в 2003 вышеописанный код должен сработать. Добавлено @ 22:48 mr.DUDA, |
| Автор: Exception 19.3.2006, 22:53 |
| mr.DUDA дело говорит. |
| Автор: VisualProgrammerNET 19.3.2006, 22:59 |
| Я понимаю, что дело, но |
| Автор: Exception 19.3.2006, 23:30 | ||
| 1. Проверяй значение Control.InvokeRequired 2. Если false, можешь обращаться к свойствам напрямую 3. Если true, передаешь методу анонимный делегат, меняющий значение Примерно выглядит так:
|
| Автор: VisualProgrammerNET 19.3.2006, 23:48 |
| Эк как всё хитро задумано... |
| Автор: mr.DUDA 20.3.2006, 10:20 | ||
| Exception, жжош В 2003-й лямбда-функций нет, поэтому там будет вот так:
|
| Автор: VisualProgrammerNET 2.4.2006, 13:52 | ||
| Продолжение басни. А что если есть некий класс, например, рисующий кружочек.
При дебагге (ставил брейкпойнт на c.DoAction();), ход приложения запарывается как раз на этой строке. Без ошибок, без всего. Просто ничего не происходит с кружочками... Но Invalidate выполняется. В чём беда? |
| Автор: Exception 2.4.2006, 14:12 |
| Можно все-таки код посмотреть полностью? Мало что понятно из этого куска. |
| Автор: VisualProgrammerNET 2.4.2006, 14:21 | ||||||
| Ммм... ща постараюсь выдрать то, что относится к этой части программы... Собсна, это класс-кружочек
Там ещё многое нуждается в доработке, да... ---------------------- Вот код главной формы (управляющей)
---------------------- А это LocationForm, где отрисовывается и двигается классы-кружочки
Много мусора в коде, да =) Ещё только в начале пути... |
| Автор: VisualProgrammerNET 3.4.2006, 00:21 |
| Неужели совсем ничего нельзя сделать с этой штукой? |
| Автор: mr.DUDA 3.4.2006, 22:48 |
| VisualProgrammerNET, маньяк убийц0 |
| Автор: VisualProgrammerNET 4.4.2006, 12:57 |
| Это да, но что с проблемой делать? Можно ли как-нибудь сделать, чтобы класс поддерживал метод Invoke? |
| Автор: Exception 4.4.2006, 17:23 |
| Чего-то у меня совсем голова не варит. Можно ещё раз разжевать проблему и чуточку поконкретнее код (а мусора и правда много).. |
| Автор: VisualProgrammerNET 4.4.2006, 20:12 | ||
| Итак. Есть класс Creat. В этом классе есть метод DoAction(). Экземпляр класса создаётся по нажатию кнопки на форме. Концепция программы такова, что
должно выполняться постоянно (т.е. бесконечно) в отдельном потоке. С бесконечностью проблем нет, но так как класс создаётся из другого потока, то в отдельный поток нельзя перенести c.DoAction(). Вот мне надо, чтобы всё работало =) |
| Автор: Exception 4.4.2006, 21:16 |
| А что мешает создать экземпляры в том же потоке? |
| Автор: VisualProgrammerNET 5.4.2006, 11:34 |
| Ладно, что-нибудь придумаю |