Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
TreGG
Зарегистрирован: 23.06.2006 Сообщения: 2
|
Добавлено: Пт Июн 23 2006 05:36 Заголовок сообщения: C# Обращение из одного потока в другой |
|
|
пишу на шарпе
Моя программа принимает данные со звуковой карты, организовано это с помощью DirectSound с использованием нотификаций. Так вот эти нотификации работают в своем потоке, а мне надо передать полученный кусок из буфера в основную программу для обработки и что самое важное - вывода данных на форму. В хелпе я нашел что это можно сделать с помощью Invoke. Все бы хорошо, но когда я закрываю программу и в этот момент происходит этот самый invoke, он в меня кидается вот такой фразой:
Exception has been thrown by the target of an invocation.
Я пошел другим путем - записываю данные в глобальную переменную и вместе с этим флажок который меняется то в одну то в другую сторону как триггер, и в основной программе у меня крутится backgroundworker, вот такой:
Код: | private void bgCheckTrigger_DoWork(object sender, DoWorkEventArgs e)
{
bool lastState = ProcessTrigger;
while (lastState == ProcessTrigger) { /* ничего не делаем */ }
}
private void bgCheckTrigger_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
bgCheckTrigger.RunWorkerAsync();
Processor();
} |
результат тот же самый правда немного пореже...
подскажите как это правильно сделать, чтобы оно не ругалось... |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Пт Июн 23 2006 14:15 Заголовок сообщения: Re: C# Обращение из одного потока в другой |
|
|
TreGG писал(а): | ...подскажите как это правильно сделать... |
при написании многопоточных приложений необходимо выполнять следующие условия...
1) контролировать синхронные фазы подъёма/шутдауна всех потоков из основного. (Если Вы их не контрлируете, то зачем тогда вообще что либо запускать ? Ведь Вас же не волнует - работает нитка или нет ?)
2) для передачи данных между потоками (синхронизации событий) необходимо использовать системные объекты (семафоры, мьютексы, триггера и т.п.). Так же "в бой идут" критические секции.
выполнив это - убъёте падёж в своей программе. Да, сразу скажу - даже если Вы сможете поставить подпорочки под существующий вариант и он будет дышать - рекомендую сразу проверить на стрэсс тестировании. Чтоб потом не удивляться и не спрашивать, а почему у меня на одном компе работает, а на другом - нет.... и т.п..
удачи Вам
(круглый) _________________ (круглый) |
|
Вернуться к началу |
|
|
TreGG
Зарегистрирован: 23.06.2006 Сообщения: 2
|
Добавлено: Сб Июн 24 2006 01:18 Заголовок сообщения: |
|
|
Огромное вам спасибо! Понял в чем у меня ошибки. |
|
Вернуться к началу |
|
|
YaKor
Зарегистрирован: 10.02.2006 Сообщения: 5
|
Добавлено: Вт Ноя 14 2006 20:22 Заголовок сообщения: |
|
|
Радует что кто то что то понял:))))
Но объясните мне плиз придурку. У меня как раз и есть удивление от того что у меня работает а у клиента нет. Причем у всех клиентов поразному. Я в потоке печатая. И все бы здорово, тока не фига. Больше нескольких потоков вешается вся моя прога:(((((((
И если мне не изменяет память не только она. Может скажети какова я натворил????? |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Вт Ноя 21 2006 14:40 Заголовок сообщения: |
|
|
YaKor писал(а): | Радует что кто то что то понял)))
Но объясните мне плиз придурку. У меня как раз и есть удивление от того что у меня работает а у клиента нет. Причем у всех клиентов поразному. Я в потоке печатая. И все бы здорово, тока не фига. Больше нескольких потоков вешается вся моя прога((((((
И если мне не изменяет память не только она. Может скажети какова я натворил????? |
рекомендую почитать книгу
"Windows для проффессионалов" Рихтер... там думаю найдёте побольше ответов...
(круглый) |
|
Вернуться к началу |
|
|
|