Проблема с ожиданием событий
От: Аноним  
Дата: 27.05.05 08:16
Оценка:
Вот минимальный код (форма с кнопкой):


private void button1_Click(object sender, System.EventArgs e)
{
int numberOfThreads = 10;
TT[] thrs = new TT[numberOfThreads];
ManualResetEvent[] events =
new ManualResetEvent[numberOfThreads];

for(int i = 0; i < numberOfThreads; i++)
{
thrs[i] = new TT();
events[i] = thrs[i].event__;
thrs[i].Start();
}

WaitHandle.WaitAll(events, new TimeSpan(0, 0, 5), false); // Вот здесь вылетает такая ошибка:
// An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll

// Additional information: WaitAll for multiple handles on an STA thread is not supported.
}
}

public class TT
{
public ManualResetEvent event__ = new ManualResetEvent(false);

public void Start()
{
new Thread(new ThreadStart(this.ThreadFunc)).Start();
}

public void ThreadFunc()
{
this.event__.Set();
}
}




В проекте я использую Syncfusion-овский компонент MainFrameBarManager. Если его убрать, то все срабатывает на ура. Может быть кто-нибудь сталкивался с подобным, бьюсь уже второй день . Help. Заранее спасибо
Re: Проблема с ожиданием событий
От: Аноним  
Дата: 27.05.05 08:18
Оценка:
Вот нормальный код:


private void button1_Click(object sender, System.EventArgs e)
        {
            int numberOfThreads = 10;
            TT[] thrs = new TT[numberOfThreads];
            ManualResetEvent[] events = 
                new ManualResetEvent[numberOfThreads];

            for(int i = 0; i < numberOfThreads; i++)
            {
                thrs[i] = new TT();
                events[i] = thrs[i].event__;
                thrs[i].Start();
            }
    
            WaitHandle.WaitAll(events, new TimeSpan(0, 0, 5), false); // Вот здесь вылетает такая ошибка:
// An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll

// Additional information: WaitAll for multiple handles on an STA thread is not supported.
        }
    }
    
    public class TT
    {
        public ManualResetEvent event__ = new ManualResetEvent(false);

        public void Start()
        {
            new Thread(new ThreadStart(this.ThreadFunc)).Start();
        }

        public void ThreadFunc()
        {
            this.event__.Set();
        }
    }
Re: Проблема с ожиданием событий
От: Аноним  
Дата: 27.05.05 13:03
Оценка:
Весь humor в том, что код рабочий, он вылетает лишь после срабатывния конструктора:

this.mainFrameBarManager1 = new Syncfusion.Windows.Forms.Tools.XPMenus.MainFrameBarManager(this.components, this);

Что там внутрях понаписали разработчики из Syncfusion остается только гадать. Искал у них на форумах, но безрезультатно. Что можете посоветовать? Буду рад любым предложениям. Спасибо


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Проблема с ожиданием событий
От: Аноним  
Дата: 31.05.05 05:55
Оценка:
Здравствуйте, dive, Вы писали:

D>Весь humor в том, что код рабочий, он вылетает лишь после срабатывния конструктора:


D> this.mainFrameBarManager1 = new Syncfusion.Windows.Forms.Tools.XPMenus.MainFrameBarManager(this.components, this);


D>Что там внутрях понаписали разработчики из Syncfusion остается только гадать. Искал у них на форумах, но безрезультатно. Что можете посоветовать? Буду рад любым предложениям. Спасибо


D>
данное сообщение получено с www.gotdotnet.ru

D>ссылка на оригинальное сообщение


Может есть другой способ ожидания завершения потоков?
Re[2]: Проблема с ожиданием событий
От: _FRED_ Россия
Дата: 31.05.05 06:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вот нормальный код:

     // [...skipped...]
А>   WaitHandle.WaitAll(events, new TimeSpan(0, 0, 5), false); // Вот здесь вылетает такая ошибка:
А>   // An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll
А>   // Additional information: WaitAll for multiple handles on an STA thread is not supported.

Попробуй установить для потока МТА. Для основного можно снабдить метод Main аттрибутом MTAThreadAttribute, для любого — System.Threading.Thread.ApartmentState в FW 1.1 или System.Threading.Thread.SetAppartmentState(System.Threading.ApartmentState state) для FW 2.0.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Проблема с ожиданием событий
От: Аноним  
Дата: 31.05.05 07:03
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, <Аноним>, Вы писали:


А>>Вот нормальный код:

_FR>
_FR>     // [...skipped...]
А>>   WaitHandle.WaitAll(events, new TimeSpan(0, 0, 5), false); // Вот здесь вылетает такая ошибка:
А>>   // An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll
А>>   // Additional information: WaitAll for multiple handles on an STA thread is not supported.
_FR>

_FR>Попробуй установить для потока МТА. Для основного можно снабдить метод Main аттрибутом MTAThreadAttribute, для любого — System.Threading.Thread.ApartmentState в FW 1.1 или System.Threading.Thread.SetAppartmentState(System.Threading.ApartmentState state) для FW 2.0.

Спасибо за ответ! С аттрибутами я уже игрался. Ставил для основного потока [MTAThread], при этом падал код в конструкторе компонента MainFrameBarManage (ошибка такая: An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll

Additional information: Exception has been thrown by the target of an invocation.)

Менял у потоков апартменты, ничего не помогает. Может еще что-нибудь можно сделать. Мне и без компонента никак и потоки нужны
Re[4]: Проблема с ожиданием событий
От: _FRED_ Россия
Дата: 31.05.05 07:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо за ответ! С аттрибутами я уже игрался. Ставил для основного потока [MTAThread], при этом падал код в конструкторе компонента MainFrameBarManage (ошибка такая: An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
А>Additional information: Exception has been thrown by the target of an invocation.)
А>Менял у потоков апартменты, ничего не помогает. Может еще что-нибудь можно сделать. Мне и без компонента никак и потоки нужны

STAThread, скорее всего, нужен для возможности регистрации драгдропа. Если тебе драгдроп не нужен, поотключай его у всех элементов управления и поставь MTAThread.

Если без STAThread не обойтись, то натыкаемся, скорее всего, на это (из описания к WaitForMultipleObjects):

Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. For example, the Dynamic Data Exchange (DDE) protocol and the COM function CoInitialize both indirectly create windows that can cause a deadlock. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForMultipleObjects.

То есть, попробуй импортировать из апи MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx и ждать в них.

Так же есть вариант попробовать синхронизироваться не через события, а через lock.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Проблема с ожиданием событий
От: Аноним  
Дата: 31.05.05 10:54
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, <Аноним>, Вы писали:

А>>Спасибо за ответ! С аттрибутами я уже игрался. Ставил для основного потока [MTAThread], при этом падал код в конструкторе компонента MainFrameBarManage (ошибка такая: An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
А>>Additional information: Exception has been thrown by the target of an invocation.)
А>>Менял у потоков апартменты, ничего не помогает. Может еще что-нибудь можно сделать. Мне и без компонента никак и потоки нужны

_FR>STAThread, скорее всего, нужен для возможности регистрации драгдропа. Если тебе драгдроп не нужен, поотключай его у всех элементов управления и поставь MTAThread.


_FR>Если без STAThread не обойтись, то натыкаемся, скорее всего, на это (из описания к WaitForMultipleObjects):

_FR>

_FR>Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. For example, the Dynamic Data Exchange (DDE) protocol and the COM function CoInitialize both indirectly create windows that can cause a deadlock. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForMultipleObjects.

_FR>То есть, попробуй импортировать из апи MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx и ждать в них.

_FR>Так же есть вариант попробовать синхронизироваться не через события, а через lock.


MsgWaitForMultipleObjects не подходит, надо ждать около 5 минут, TimeSpan эта функция не принимает. Не совсем ясно как мне ожидать завершения событий через lock. Тем не менее спасибо за внимание к проблеме
Re[6]: Проблема с ожиданием событий
От: _FRED_ Россия
Дата: 31.05.05 11:27
Оценка:
Здравствуйте, <Аноним>, Вы писали:
А>MsgWaitForMultipleObjects не подходит, надо ждать около 5 минут, TimeSpan эта функция не принимает.

DWORD'а не хватит?
кол-во миллисекунд в сутках = 10^3 * 60 * 60 * 24 = 86.400.000 << 2^32

Не путайте милли = 10^(-3) и микро 10^(-6)

А>Не совсем ясно как мне ожидать завершения событий через lock.


Пересмотреть логику синхронизации.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Проблема с ожиданием событий
От: Аноним  
Дата: 31.05.05 12:01
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, <Аноним>, Вы писали:

А>>MsgWaitForMultipleObjects не подходит, надо ждать около 5 минут, TimeSpan эта функция не принимает.

_FR>DWORD'а не хватит?

_FR>
_FR>кол-во миллисекунд в сутках = 10^3 * 60 * 60 * 24 = 86.400.000 << 2^32
_FR>

_FR>Не путайте милли = 10^(-3) и микро 10^(-6)

А>>Не совсем ясно как мне ожидать завершения событий через lock.


_FR>Пересмотреть логику синхронизации.

Просто забыл что DWORD -> unsigned (int)long, а не (int)(long)

к тому же скорее вот так:

кол-во миллисекунд в сутках = 10^3 * 60 * 60 * 24 = 86.400.000 << 2^32 — 1
Re[5]: Проблема с ожиданием событий
От: Аноним  
Дата: 31.05.05 12:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>[/q]

_FR>То есть, попробуй импортировать из апи MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx и ждать в них.

А можно пример . А то в .NET с Win32 API работать еще не приходилось


        [DllImport("user32.dll")]
        public static extern int MsgWaitForMultipleObjects(int nCount,
            ref int pHandles, int fWaitAll, uint dwMilliseconds, int dwWakeMask); 

        private void button1_Click(object sender, System.EventArgs e)
        {
            const int numberOfThreads = 10;
            TT[] thrs = new TT[numberOfThreads];
            ManualResetEvent[] events = 
                new ManualResetEvent[numberOfThreads];

            for(int i = 0; i < numberOfThreads; i++)
            {
                thrs[i] = new TT();
                events[i] = thrs[i].event__;
                thrs[i].Start();
            }
            MsgWaitForMultipleObjects(numberOfThreads, /* Что вот сюда вставить*/, 0, 500000, 1); 
}
Re[6]: Проблема с ожиданием событий
От: _FRED_ Россия
Дата: 31.05.05 12:18
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, _FRED_, Вы писали:


_FR>>[/q]

_FR>>То есть, попробуй импортировать из апи MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx и ждать в них.

А>А можно пример . А то в .NET с Win32 API работать еще не приходилось


pinvoke.net
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Проблема с ожиданием событий
От: Аноним  
Дата: 31.05.05 12:38
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>pinvoke.net


Как -то странно ведет себя функция. События выставлены, а она еще секунду ждет (не тайм-аут!) и только потом выходит из блокировки. Но спасибо и за это
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.