![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
CYBERDREAM |
|
|||
![]() I think, there4 I am ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1096 Регистрация: 31.10.2006 Где: CyberLand Репутация: 11 Всего: 28 |
Доброго времени суток всем.
Есть главный поток приложения - <<MAIN>>. И несколько второстепенных. Мне нужно из второстепенного потока, запустить метод в главном. Каким образом можно это осуществить? -------------------- Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно) Telegram, skype: kuchuk.artiom |
|||
|
||||
farad |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: -1 Всего: 6 |
выстави флаг из второстепенного потока в виде какой-нибудь статической открытой переменной, а в главном ее проверяй..
Добавлено через 2 минуты и 37 секунд PostMessage можно еще через API делать |
|||
|
||||
CYBERDREAM |
|
|||
![]() I think, there4 I am ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1096 Регистрация: 31.10.2006 Где: CyberLand Репутация: 11 Всего: 28 |
Вопрос, как в главном потоке осуществлят проверку? Таймером?
-------------------- Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно) Telegram, skype: kuchuk.artiom |
|||
|
||||
farad |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: -1 Всего: 6 |
если поток ничего не делает, то таймером. Если в нем выполняется какая-то работа - то в процессе вычислений делать проверку флага.. Если не хочется связываться с таймером шли главному окну сообщения через PostMessage, когда дойдет очередь до твоего сообщения - оно будет обработано.. ну ловить его естественно в WndProc...
Добавлено через 2 минуты и 24 секунды Да. еще не стоит использовать SendMessage - есть риск наглухо залочить все твои потоки |
|||
|
||||
KLUBS |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 11.2.2007 Где: Спб Репутация: 1 Всего: 1 |
а не проще
{ Invoke(...) } |
|||
|
||||
farad |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: -1 Всего: 6 |
ну если есть главная форма в главном потоке, тогда скорее всего проще.. Но это должно быть обращение к контролам, а если нам надо просто метод дернуть, ну тогда хз. Я бы тогда тупо через флаги делал..
Это сообщение отредактировал(а) farad - 31.1.2008, 18:53 |
|||
|
||||
KLUBS |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 11.2.2007 Где: Спб Репутация: 1 Всего: 1 |
зачем контролы??????????? this.Invoke.......
|
|||
|
||||
farad |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: -1 Всего: 6 |
||||
|
||||
CYBERDREAM |
|
|||
![]() I think, there4 I am ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1096 Регистрация: 31.10.2006 Где: CyberLand Репутация: 11 Всего: 28 |
Сдаетс мне, farad прав, тогда остается лишь вариант с таймером, хотя и не очень желаемый
![]() -------------------- Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно) Telegram, skype: kuchuk.artiom |
|||
|
||||
KLUBS |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 11.2.2007 Где: Спб Репутация: 1 Всего: 1 |
хм.. а разве необходимо приложение не содрежащие ни одного контрола?? какое если не секрет???
можно создать класс
|
|||
|
||||
Alexsar |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 6.5.2005 Репутация: 2 Всего: 1 |
Зачем вообще так делать? IMHO всё можно решить с помощью делегатов
вот к примеру код //объявляется в неймспейсе проекта delegate void SetTextCallback(string text, Control e); ...... //метод класса private void SetText(String text, Control e) { if (/*this.*/e.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text, e }); } else { e.Text = text; } } ........ //метод второстепенного потока while(true) { SetText(sek.ToString(), this.textbox1); sek++; Thread.Sleep(1000); } Данный пример иллюстрирует один из способов решения проблемы, этот код можно использовать например для формы, в которой есть текстовое поле-секундомер(контрол - в главном потоке, а данные формируются во второстепенном). Так как контрол живёт в главном потоке, а свойства его можно изменять только поток породивший его, то если просто в другом потоке тупо набрать textbox1.Text = "бла бла"; ничего хорошего не будет. А используя делегаты всё чётко, один поток отвечает за прорисовку контролов, другой изменяет данные, вызывая нужную функцию. Делегаты rulezzzzzz ![]() |
|||
|
||||
CYBERDREAM |
|
|||
![]() I think, there4 I am ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1096 Регистрация: 31.10.2006 Где: CyberLand Репутация: 11 Всего: 28 |
Thx Alexsar, предполагал что делегаты дадут верный ответ, но с ними еще не подружился, постараюсь завтра сделать шаг им навстречу.
-------------------- Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно) Telegram, skype: kuchuk.artiom |
|||
|
||||
KLUBS |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 11.2.2007 Где: Спб Репутация: 1 Всего: 1 |
даа))
я такого не знал, спасибо)) |
|||
|
||||
farad |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 1.11.2007 Репутация: -1 Всего: 6 |
можно, только все будет запущено в том потоке, за который дернул за делегат. что с названием темы не совсем согласуется.. Добавлено через 1 минуту и 29 секунд Alexsar, а Invoke связано с контролами, о чем говорили в самом начале.. |
|||
|
||||
Alexsar |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 6.5.2005 Репутация: 2 Всего: 1 |
ну тогда если не устраивают делегаты используй события класса AutoResetEvent.
второстепенный поток будет генерировать событие - Set, а главный ждать с помощью WaitOne, так уж точно будет выполнять всё главный поток, и без всяких таймеров и флагов |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |