如何一边放音乐,一边打字,两不误呢? (因为当播放另一个背景音乐时,就不能打字,大概需等待2-3秒时间,如何解决?)(50分)

  • 主题发起人 主题发起人 ptfjy
  • 开始时间 开始时间
P

ptfjy

Unregistered / Unconfirmed
GUEST, unregistred user!
如何一边放音乐,一边打字,两不误呢? (因为当播放另一个背景音乐时,就不能打字,大概需等待2-3秒时间,如何解决?)
 
…………
不知道你在说什么
 
你怎么放音乐的?playsound好像可以异步播放
 
谢谢, 上面的朋友!!!
--------------------------------------
我做了一个打字软件,有背景音乐。
但当一首歌播放完后,自动播放下一首歌时, 就不能打字 ,需等待2-3秒时间,
我的意思是:
相当于创建一个进程:以打字为主进程, 背景音乐为次进程。
请问如何解决? 我用的控件是TMediaPlayer。
 
这个是装入的问题,你想办法在这之间就把文件调入内存啊
 
你将播放背景音乐的线程的优先度设为最低,当装入文件时对主线程不会有多大的影响。
 
xuxiaohan:你好!
如何将“播放背景音乐的线程的优先度设为最低”?
能否给出一些代码参考。
 
Tmediaplayer open一个新的文件的时候肯定会造成程序停止。
不如你让用户自己切换背景音乐 他就不会感觉到停顿了 ^_^
 
線程有個優先等級,至於你用什麼實現多線程,是用TThread類還是CreateThread API函數?
用TThread 他就有個Priority是調節線程優先級屬性的。
用CreateThread 他的第一個參數就是優先級參數。
 
这个问题如果是VB的话好解决, 它有一个好像是DoEver...这样的一个函数,
但现在的Delphi 没有这样的函数, 我估计要用到“主线程”、 “次线程”
这种概念了, 但这概念我不是很熟悉, 希望有人能给出一段代码, 谢谢!
 

TPlayThread = class(TThread)
protected
procedure Execute;
override;
end;
procedure TmainFrm.FormCreate(Sender: TObject);
begin
TPlayThread.Create(false);
end;

procedure TPlayThread.Execute;
begin
Priority:=tpLowest;
repeat
//在这了打开并播放音乐
//加上代码判断播放是否完毕等等..........重新播放
until Terminated;
end;
 
xuxiaohan:你好!
我先试试, 马上给分!
 
首先纠正一下你的错误:
1、进程:运行着的程序。(每一个程序实例只能创建一个进程,不可能有你说的什么主进程、次进程)
2、你所要实现的所谓主次实际上是线程。每个程序中可以创建多个线程。
实现方法:
打字放在主线程中,背景音乐单独放在另外创建的一个线程中。
TMediaPlayer没用过,好像不太好用。
播放一般的音乐格式,用PlaySound函数应该就可以了。
 
如何处理音乐已经放完了呢?
我原本的处理音乐的代码在MediaPlayer1Notify事件中判断的, 如下:
procedure Tfrmptfjy.MediaPlayer1Notify(Sender: TObject);
begin
With Mediaplayer1do
begin
if Notify and (mode=mpStopped) then
begin
重新播放;
end;
end;
end;
---------------------------------------------
现在, 这代码应该放到那里呢?
---------------------------------------------
 

BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
看看说明吧
MediaPlayer 不合适的,
代码就放在
procedure TPlayThread.Execute;
begin
Priority:=tpLowest;
repeat
//在这了打开并播放音乐
PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
//加上代码判断播放是否完毕等等..........重新播放
until Terminated;
end;
 
xuxiaohan都说了。就是这样:)
 
xuxiaohan:你好!
1、下面的代码放哪里, 好像要出错, 不好意思, 本人对“线程”是第一次接触。
TPlayThread = class(TThread)
protected
procedure Execute;
override;
end;
2、用下面的代码, 如何判断音乐有没有播放完毕? 能用来播放mid文件吗?
PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
//加上代码判断播放是否完毕等等..........重新播放
------------------------------------------------------------------
谢谢!!!
 
xuxiaohan:你好!
如果觉得分不够多,另处再给!
 
人家不是给你函数的原型了吗?
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
返回值就是播放完成的状态。判断一下就行了。
Execute过程不是自己创建的。你应该用New - New Thread Unit,建立一个新的线程单元,程序会自动生成一个Execute过程,把代码写在那里面。参考一下Delphi自带的线程Demo。
 
如果你不会用PlaySound函数,你也可以在线程里面创建一个TMediaPlayer,然后用你自己的方法。
 
后退
顶部