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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение потоком другой задачи 
V
    Опции темы
MaxWave
Дата 8.1.2009, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем здрасти!!!

Вообщем имеется второй фоновый поток, который делает что то типа того

Код

while(true)
{
     frameStarted();
}



Так же в этом потоке создается много объектов (не контролы и не WinForms), которые естествеено, можно использовать только из этого потока. Как вызвать функцию из этого потока главным потоком? 
Пытался делать так:
Код

but = new Button();//создается контрол в фоновом потоке
but.CreateControl();

..
..
//наступило событие в главном потоке
but.Invoke(функция_в_фоновом_потоке); 


, но не вызывается, т.к. цикл забрал весь поток. Как ему сказать, что бы он переключился и выполнил функцию, а потом опять начал работать цикл.
Пробовал создавать делегаты в этом потоке а потом вызывать из главного, но почему то вызываются в контексте главного потока (делал  примерно как  тут )

Собственн наверно вопрос в том, как сделать так, то бы поток прекратил цикл, обработал вызов функции, а потом продолжил цикл.

Это сообщение отредактировал(а) MaxWave - 8.1.2009, 09:27
PM MAIL   Вверх
MaxWave
  Дата 8.1.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



кароче решил траблу с помощью очереди анонимных делегатов. Жесть.

Код

public delegate void Handler();

public class InvokeManager
    {
        static Queue<Handler>m_delegsToInvoke= new Queue<Handler>();

        static object m_threadLocker = new object();

        public static void AddDelegate(Handler dlg)
        {
            lock(m_threadLocker)
                m_delegsToInvoke.Enqueue(dlg);
        }

        public static void InvokeDelegates()
        {
            while (m_delegsToInvoke.Count > 0)
            {
                Handler invoke;

                lock (m_threadLocker)
                    invoke = m_delegsToInvoke.Dequeue();

                invoke();
            }
        } 
    }


По наступлении события делаем типа так

 InvokeManager.AddDelegate(delegate  {mogreWin.app.Keyboard_Handler( e,true);});


В другом потоке:

Код

while (!quit)
            {
                InvokeManager.InvokeDelegates();
               ..


            }


 
И будет вам счастье. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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