C # multi CPU для ThreadPool.QueueUserWorkItem - PullRequest
0 голосов
/ 06 апреля 2010

У меня есть программа, которая использует:

ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);

В Windows7 и Vista он работает нормально.

Когда я пытаюсь запустить его на XP, результат немного отличается от других.

Мне просто интересно, чтобы правильно выполнить QueueUserWorkItem, нужна ли мне двухпроцессорная система?

В XP, на которой я пытался протестировать, был установлен .Net 3.5.

Входные данные приветствуются.

РЕДАКТИРОВАТЬ: процедура обратного вызова воспроизводит серию звуковых файлов. в win7 и vista все они играют. но в XP только пара из них играет. Я не получаю никаких исключений из программы.

РЕДАКТИРОВАТЬ: Да, XP box одноядерный. более 5 лет.

РЕДАКТИРОВАТЬ: мое приложение использует Winsock, и я запустил клиент и сервер на компьютере с XP. Я попробую запустить его с одним экземпляром для каждой машины и посмотрю, как он реагирует.

РЕДАКТИРОВАТЬ: Как вы играете звуки?

            SoundPlayer fire = new SoundPlayer(Properties.Resources.fire);
            fire.PlaySync();
            fire.Dispose();

Ответы [ 5 ]

1 голос
/ 06 апреля 2010

Vista и Windows 7 обрабатывают звук иначе, чем Windows XP, поэтому это, вероятно, реальный источник вашей проблемы (то есть он не имеет ничего общего с QueueUserWorkItem).

Как вы играете звуки (поскольку есть много разных способов сделать это)?

Редактировать: Когда вы говорите, что играете «серию» звуков, вы имеете в виду, что вы пытаетесь воспроизводить один звук за другим, или вы пытаетесь воспроизвести несколько звуков все одновременно?

1 голос
/ 06 апреля 2010

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

Если вы видите разницу в одноядерной системе, это, скорее всего, означает, что в вашем коде есть условие гонки. Единственная разница должна заключаться в том, что это занимает больше времени - поскольку ОС не может запускать оба потока одновременно.

0 голосов
/ 06 апреля 2010

Поведение менеджера ThreadPool имеет значение.Он старается избегать планирования большего количества потоков, чем у вас есть ядра.Таким образом, если ваш компьютер с XP имеет одноядерный процессор, он будет запускать только один поток.Только когда потоки "застревают" и не завершаются своевременно, это позволяет другому потоку запускаться.Эти решения по планированию принимаются дважды в секунду.

Учитывая, что вы используете потоки для воспроизведения звуков, поток пула потоков не является подходящим решением.Вы должны создать свою собственную тему.

0 голосов
/ 06 апреля 2010

Возможно, у вас проблемы с API воспроизведения звуковых файлов.Ссылка ниже говорит о проблемах воспроизведения нескольких звуковых файлов через очень короткие промежутки времени или почти одновременно с использованием PInvoke из приложения C #Может ли это быть похоже на вашу проблему?

http://www.hanselman.com/blog/CategoryView.aspx?category=BabySmash&page=3

0 голосов
/ 06 апреля 2010

Что именно вы видели?

Синхронизация с потоками не является детерминированной, поэтому неудивительно, что вы видели другие результаты, если запускали его на однопроцессорной машине. Это потому, что только с одним ядром (без гиперпоточности) одна инструкция может выполняться только за один раз, поэтому вы не увидите истинное параллельное выполнение.

НО, Windows XP поддерживает несколько ядер, как Windows 7 или Vista. Я предполагаю, что компьютер с XP, на котором вы его запускали, был старше и имел только 1 процессор?

...