Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запустить метод в другом потоке 
V
    Опции темы
CYBERDREAM
Дата 31.1.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Доброго времени суток всем.
Есть главный поток приложения - <<MAIN>>. И несколько второстепенных. 
Мне нужно из второстепенного потока, запустить метод в главном. Каким образом можно это осуществить?



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
farad
Дата 31.1.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



выстави флаг из второстепенного потока в виде какой-нибудь статической открытой переменной, а в главном ее проверяй..

Добавлено через 2 минуты и 37 секунд
PostMessage можно еще через API делать
PM MAIL   Вверх
CYBERDREAM
Дата 31.1.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Вопрос, как в главном потоке осуществлят проверку? Таймером?


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
farad
Дата 31.1.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(CYBERDREAM @  31.1.2008,  14:41 Найти цитируемый пост)
как в главном потоке осуществлят проверку?
если поток ничего не делает, то таймером. Если в нем выполняется какая-то работа - то в процессе вычислений делать проверку флага.. Если не хочется связываться с таймером шли главному окну сообщения через PostMessage, когда дойдет очередь до твоего сообщения - оно будет обработано.. ну ловить его естественно в WndProc...

Добавлено через 2 минуты и 24 секунды
Да. еще не стоит использовать SendMessage - есть риск наглухо залочить все твои потоки
PM MAIL   Вверх
KLUBS
Дата 31.1.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



а не проще 




{
Invoke(...)
}
PM MAIL ICQ Skype   Вверх
farad
Дата 31.1.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(KLUBS @  31.1.2008,  17:40 Найти цитируемый пост)
а не проще {Invoke(...)}
ну если есть главная форма в главном потоке, тогда скорее всего проще.. Но это должно быть обращение к контролам, а если нам надо просто метод дернуть, ну тогда хз. Я бы тогда тупо через флаги делал.. 


Это сообщение отредактировал(а) farad - 31.1.2008, 18:53
PM MAIL   Вверх
KLUBS
Дата 31.1.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



зачем контролы??????????? this.Invoke.......
PM MAIL ICQ Skype   Вверх
farad
Дата 31.1.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(KLUBS @  31.1.2008,  19:01 Найти цитируемый пост)
зачем контролы??????????? this.Invoke
А Invoke(...)разве не метод класса Control?
PM MAIL   Вверх
CYBERDREAM
Дата 1.2.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Сдаетс мне, farad прав, тогда остается лишь вариант с таймером, хотя и не очень желаемый smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
KLUBS
Дата 1.2.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



хм.. а разве необходимо приложение не содрежащие ни одного контрола?? какое если не секрет???
можно создать класс 

Код


A : Control

A a = new A();

A.Invoke()....

PM MAIL ICQ Skype   Вверх
Alexsar
Дата 2.2.2008, 00:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 smile 
PM MAIL   Вверх
CYBERDREAM
Дата 2.2.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Thx Alexsar, предполагал что делегаты дадут верный ответ, но с ними еще не подружился, постараюсь завтра сделать шаг им навстречу.


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
KLUBS
Дата 2.2.2008, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: 1
Всего: 1



даа))
я такого не знал, спасибо))
PM MAIL ICQ Skype   Вверх
farad
Дата 2.2.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(Alexsar @  2.2.2008,  00:21 Найти цитируемый пост)
Зачем вообще так делать? IMHO всё можно решить с помощью делегатов

можно, только все будет запущено в том потоке, за который дернул за делегат. что с названием темы не совсем согласуется..

Добавлено через 1 минуту и 29 секунд
Alexsar, а Invoke связано с контролами, о чем говорили в самом начале..
PM MAIL   Вверх
Alexsar
Дата 2.2.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: 2
Всего: 1



ну тогда если не устраивают делегаты используй события класса AutoResetEvent.
второстепенный поток будет генерировать событие - Set, а главный ждать с помощью WaitOne, так уж точно будет выполнять всё главный поток, и без всяких таймеров и флагов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1260 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.