0

我有一个程序使用:

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

在 Windows7 和 Vista 上运行良好。

当我尝试在 XP 上运行它时,结果与其他的有点不同。

我只是想知道为了正确执行 QueueUserWorkItem 我需要双 CPU 系统吗?

我尝试测试的 XP 安装了 .Net 3.5。

输入最受欢迎。

编辑:回调过程播放一系列声音文件。win7和vista都玩。但在 xp 中只有几个播放。我没有从程序中得到任何例外。

编辑:是的,XP 盒子是单核的。5岁以上。

编辑:我的应用程序使用 Winsock,我在 XP 机器上运行客户端和服务器。我将尝试在每台机器上运行一个实例,看看它是如何反应的。

编辑:你是如何播放声音的?

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

5 回答 5

1

主要区别在于,在单核系统上,一次只能运行一个线程。如果您的程序设计得当,这无关紧要,因为操作系统会切换线程进出并为您管理。

如果您在单核系统上看到差异,这很可能意味着您的代码中存在竞争条件。唯一的区别应该是它需要更长的时间——因为操作系统不能同时运行两个线程。

于 2010-04-06T16:23:13.137 回答
1

Vista 和 Windows 7 处理音频的方式与 Windows XP 不同,因此这可能是您问题的真正根源(即它与QueueUserWorkItem.

你是如何演奏这些声音的(因为有很多不同的方法可以做到这一点)?

编辑: 当你说你正在播放“一系列”声音时,你的意思是你试图一个接一个地播放一个声音,还是你试图同时播放一堆声音?

于 2010-04-06T16:38:56.740 回答
0

你到底看到了什么?

线程计时是不确定的,因此如果您在单处理器机器上运行它,您会看到不同的结果也就不足为奇了。那是因为只有一个核心(没有超线程),一条指令只能一次执行,所以你不会看到真正的并行执行。

但是,Windows XP 支持多核,就像 Windows 7 或 Vista。我假设您运行它的 XP 机器较旧,并且只有 1 个 CPU?

于 2010-04-06T16:24:50.363 回答
0

您可能会遇到声音文件播放 API 的问题。下面的链接讨论了以非常快的间隔或接近同时使用 C# 应用程序中的 PInvoke 播放多个声音文件的问题。这可能与您的问题相似吗?

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

于 2010-04-06T16:33:41.860 回答
0

ThreadPool 管理器的行为很重要。它试图小心地避免调度比你拥有的内核更多的线程。因此,如果您的 XP 机器有一个单核 CPU,它将只允许一个线程运行。只有当线程“卡住”并且没有及时完成时,它才会允许另一个线程启动。这些调度决策每秒进行两次。

鉴于您使用线程来播放声音,线程池线程不是合适的解决方案。您应该创建自己的线程。

于 2010-04-06T16:49:22.093 回答