Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Выполнение потоком другой задачи


Автор: MaxWave 8.1.2009, 01:04
Всем здрасти!!!

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

Код

while(true)
{
     frameStarted();
}



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

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

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


, но не вызывается, т.к. цикл забрал весь поток. Как ему сказать, что бы он переключился и выполнил функцию, а потом опять начал работать цикл.
Пробовал создавать делегаты в этом потоке а потом вызывать из главного, но почему то вызываются в контексте главного потока (делал  примерно как  http://forum.vingrad.ru/topic-193943.html#st_0_view_0 )

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

Автор: MaxWave 8.1.2009, 19:08
кароче решил траблу с помощью очереди анонимных делегатов. Жесть.

Код

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();
               ..


            }


 
И будет вам счастье. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)