100分,多线程中播放声音的问题,大虾们请进来看看,谢谢 ( 积分: 100 )

  • 主题发起人 主题发起人 zhaokaien
  • 开始时间 开始时间
Z

zhaokaien

Unregistered / Unconfirmed
GUEST, unregistred user!
我在给公司制作的多线程监测比对频率的软件中,有在线程中发现错误时报警的模块,我一共使用了10个线程,8个线程用来监测接收机端口,一个线程扫描GPS口,一个线程写错误日志,但是当出现多机错误报警时,程序会非常迟钝,我在程序中使用的是playsound函数播放wav文件,文件不是很大,vc++版本做的就没有问题,可能是vc++中使用了mci相关的东西,请教大虾们,delphi中应该怎么做,再次感谢了
 
我在给公司制作的多线程监测比对频率的软件中,有在线程中发现错误时报警的模块,我一共使用了10个线程,8个线程用来监测接收机端口,一个线程扫描GPS口,一个线程写错误日志,但是当出现多机错误报警时,程序会非常迟钝,我在程序中使用的是playsound函数播放wav文件,文件不是很大,vc++版本做的就没有问题,可能是vc++中使用了mci相关的东西,请教大虾们,delphi中应该怎么做,再次感谢了
 
你的PlaySound是在哪儿调用的啊?
还有你的写错误日志是一个单独的线程?那你多机错误报警的时候,
这个线程写的日志内容多吗?
 
我的playsound 是在监控接收机端口的线程里面写的,写错误日志的是一个单独线程,与gps的线程一样都是独立的线程 ,扫描接收机端口一共有8个线程,每个线程里都有报警模块,他们是从一个线程类产生出来的8个实例,只不过是通过构造函数参数赋值得不同得以扫描不同的接收机,显示不同的数据,进行不同的报警,错误日志是必须从错误开始到错误结束都要写的,内容随错误时间的不同而不同,但是并不影响速度,因为我去掉调用声音的模块后,程序非常正常,就是加上调用声音,就不行,
谢谢darnis的回复,
 
那你的 PlaySound 有没有进一步排除,就是调用 PlaySound 的才会引起反应迟钝啊?
如果按你说的,在VC里面使用了什么方式,你在 D 里也可以采用一样的方式啊,
PlaySound 的控制能力不是很好。
我用过不过就是一个线程使用它,基本没有问题,
第三参数,可以作一些简单的控制。
 
vc++程序是中国电子信息技术研究54所得一个牛人写的,不是我写的,他使用的是他同学写的一个类,但是我看不到源代码,而且vc++里面没有使用多线程技术,
我也认为是playsound出了问题,我认为要使用mci技术,但是具体怎样没有头绪,而且也不能确认
 
你先把 PlaySound 给注释掉,确认是不是它的原因。
如果是才采取进一步的行动,免得到时搞了半天不是PlaySound问题。
 
我试过了,的确就是他的原因,没有他的时候,一切正常,一点问题都没有
 
=我试试创建多个线程来播放一下有什么问题。。
 
好的,麻烦你了,
 
你的播放我不知道有没有什么特殊要求。
我试了一下同步播放,创建多个线程,不会产生资源占用很大的问题,
只是它相当于会在调用 PlaySound 的时候阻塞线程。
unit Unit2;
interface
uses
MMSystem, Classes, SysUtils;
type
TSounder = class(TThread)
private
FSoundFile: string;
protected
procedure Execute;
override;
public
constructor Create(ASoundFile: String);
overload;
property SoundFile: string read FSoundFile write FSoundFile;
end;
implementation
{ TSounder }
constructor TSounder.Create(ASoundFile: String);
begin
Inherited Create(true);
FreeOnTerminate := true;
FSoundFile := ASoundFile;
if FileExists(FSoundFile) then
Resume;
end;

procedure TSounder.Execute;
begin
PlaySound(PChar(FSoundFile), 0, SND_SYNC);
end;

end.

上面的是播放声音的线程。

procedure TForm1.Button1Click(Sender: TObject);
begin
TSounder.Create('C:/WINNT/Media/The Microsoft Sound.wav');
TSounder.Create('C:/WINNT/Media/Windows 登录音.wav');
TSounder.Create('C:/WINNT/Media/Windows 退出时奏幻想空间.WAV');
TSounder.Create('C:/WINNT/Media/巴赫的《勃兰登堡协奏曲》.RMI');
TSounder.Create('C:/WINNT/Media/The Microsoft Sound.wav');
TSounder.Create('C:/WINNT/Media/Windows 登录音.wav');
TSounder.Create('C:/WINNT/Media/The Microsoft Sound.wav');
TSounder.Create('C:/WINNT/Media/Windows 登录音.wav');
end;
上面的代码是我随便创建了几个线程,效果是声音一个接一个播放,
不会出现资源异常增加的问题。
 
不好意思,昨天公司下班了,我走得太急没给你回复
资源的异常增加我这里也不会发生,但是,就是程序很顿
任务管理器里面显shi cpu和内存都正常
 
[:)]
呵。我这边在它运行的时候(建立了线程播放声音后),我拖动窗口没有感觉有那种迟钝的感觉。
我今天有点事,要先下了。
我感觉单纯的PlaySound也不会造成你应用迟钝。可能有什么综合的因素造成的。
说不清楚。查错就是一个漫长的过程,而且有些问题到最后不得不换种方式来实现。
 
我这边是这样的播放一个声音的时候没有问题,就是说只有一个机子出错时问题不大,但是出错的机子数量多了就不行了
呵呵,真得非常感谢老兄!!
 
不知道danis兄弟之不知道在delphi中使用mcisendstring命令需要引进那些单元,这个命令应该能够改善当前的这种情况,我看到网上有人用 mci的相关命令写了一个类 ,在delphi帮助里面也有这个命令,但是我试验的时候总是出错,可能是缺少东西,但是帮助文档里面并没有详细说明
 
看 Help->Windows SDK 部分
可以找到你所需要的WIN32相关的API说明
MCI我没有用过,是黄的,呵。。
祝你早日解决问题。
 
我已经解决,调试通过 ,非常高兴,谢谢兄弟了
 
后退
顶部