如何执行完一条语句再执行下一句?

JeanLaw 2004-07-30 11:24:03
我在程序中使用了一个时钟控件,间隔是一秒,每隔一秒就调用mciExecute函数播放一段音乐.可是当上一段音乐还没播完时钟就开始继续执行下一条语句.请问该如何等音乐播完以后再让后面的语句执行?就象其他函数执行完以后再转交控制权.
...全文
649 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
JeanLaw 2004-08-01
  • 打赏
  • 举报
回复
第四:使用sndPlaySound函数通过设置SND_SYNC参数到是可以实现,可是我不知道该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。

============================================

我最初的意思就是调用mciExecute函数播放一段音乐,要求一点也没变。

我的电脑坏了,所以没法测试楼上的代码。不过总感觉和我想要的不太一样。算了,自己想办法了。
JeanLaw 2004-08-01
  • 打赏
  • 举报
回复
不管怎么说,谢了。
JeanLaw 2004-08-01
  • 打赏
  • 举报
回复
可是我 不知道 该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。
=============================================
而你说的要求“比如从第10秒到第30秒”这么大的文件,恐怕不能用sndPlaySound函数。。。还是sndPlaySound出了新版本????????
=============================================
-_-|||
lsftest 2004-08-01
  • 打赏
  • 举报
回复
第四:使用sndPlaySound函数通过设置SND_SYNC参数到是可以实现,可是我不知道该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。
===================================================
在我的记忆中,sndPlaySound函数对所播放的音乐的大小是有限制的,只能用来播放一些比较短的音效,而你说的要求“比如从第10秒到第30秒”这么大的文件,恐怕不能用sndPlaySound函数。。。还是sndPlaySound出了新版本????????

其实要达到你的要求并不难,我上面已经说了:
“如果想"播放指定时间段内的的音乐”,只需要根据
mciSendString "status MyWav position", S, Len(S), 0
的返回值跳回到你想开始播放的位置再从新播放就行了。。。。。。”

'一个例子:
'反复播放一段音乐的第10秒到第30秒。。。。。。
'模块中:
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

'程序中:
Private Sub Command1_Click()
mciSendString "close MyWav", vbNullString, 0, 0
mciSendString "open e:\abc.mp3 alias MyWav", vbNullString, 0, 0
mciSendString "seek mywav to 10000", vbNullString, 0, 0
mciSendString "play MyWav", vbNullString, 0, 0
Timer1.Interval = 500
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
mciSendString "close MyWav", vbNullString, 0, 0
Timer1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
mciSendString "close MyWav", vbNullString, 0, 0
End Sub

Private Sub Timer1_Timer()
Dim S As String
S = String(256, Chr(0))
mciSendString "status MyWav position", S, Len(S), 0
If Val(S) >= 30000 Then
mciSendString "seek mywav to 10000", vbNullString, 0, 0
mciSendString "play MyWav", vbNullString, 0, 0
End If
Label1.Caption = S
End Sub


JeanLaw 2004-07-31
  • 打赏
  • 举报
回复
mciSendString 函数可以实现播放指定时间段内的的音乐吗?我现在没法试,不过看你的代码没看出有这个功能.
lsftest 2004-07-31
  • 打赏
  • 举报
回复
你把c:\logoff.wav改为你要播放的音乐就可以了。。。注意如果是长文件名要先转为短文件名。。。。
lsftest 2004-07-31
  • 打赏
  • 举报
回复
但我在自己的机子里测试我的方法是可以的。。。
lsftest 2004-07-31
  • 打赏
  • 举报
回复
mciSendString 函数可以实现播放指定时间段内的的音乐吗?我现在没法试,不过看你的代码没看出有这个功能.
=====================================
"播放指定时间段内的的音乐"??????????????
怎么要求又变了????不是太明白你的目的。。。。
如果要播放指定时间段内的的音乐,加个seek语句。。。。一个简单例子:

'由于wav普遍都比较短,所以换mp3。。。。。。。。
'模块中:
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long


'程序中:
Private Sub Command1_Click()
mciSendString "close MyWav", vbNullString, 0, 0
mciSendString "open e:\abc.mp3 alias MyWav", vbNullString, 0, 0
mciSendString "seek mywav to 20000", vbNullString, 0, 0
mciSendString "play MyWav", vbNullString, 0, 0
Timer1.Interval = 500
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
mciSendString "close MyWav", vbNullString, 0, 0
Timer1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
mciSendString "close MyWav", vbNullString, 0, 0
End Sub

Private Sub Timer1_Timer()
Dim S As String
S = String(256, Chr(0))
mciSendString "status MyWav mode", S, Len(S), 0
If Left(S, 7) = "stopped" Or Left(S, 2) = "停止" Then
Print "播放完毕。"
Timer1.Enabled = False
Else
mciSendString "status MyWav position", S, Len(S), 0
Label1.Caption = S
End If
End Sub

上面的例子是从20秒的地方开始播放abc.mp3,直到结束,打印“播放完毕。"
如果想"播放指定时间段内的的音乐”,只需要根据
mciSendString "status MyWav position", S, Len(S), 0
的返回值跳回到你想开始播放的位置再从新播放就行了。。。。。。
留意一下label显示的值与时间的关系。。。。。。
applekiller 2004-07-30
  • 打赏
  • 举报
回复
当播放时将timer的enable 设置为Flase 播放结束时再设置为True
bluesky23 2004-07-30
  • 打赏
  • 举报
回复
最笨的办法就是得到该段音乐的文件长度(播放秒数)
然后设置timer时间间隔。
JeanLaw 2004-07-30
  • 打赏
  • 举报
回复
都不行啊。

首先,我不想用控件,只想用API函数来实现;

第二,如果先将timer设成False,那该如何判断音乐是否播完?如果这样写:

Timer1.Enabled=False
ReturnValue = mciExecute("play " & play_WaveFile & " from 28290 to 28850")
Timer1.Enabled=True

肯定不行的,还是会不等音乐播完就执行Timer1里的语句;

第三:我无法获得音乐长度,音乐的长度从10毫秒到10分钟不等;

第四:使用sndPlaySound函数通过设置SND_SYNC参数到是可以实现,可是我不知道该如何使其播放指定时间段内的音乐,比如从第10秒到第30秒。


没有人可以回答吗?
pcwak 2004-07-30
  • 打赏
  • 举报
回复
Function DoEvents() As Integer
VBA.Interaction 的成员
放弃执行,使操作系统能处理其他事件

延时
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
xinerwang 2004-07-30
  • 打赏
  • 举报
回复



UP

落伍者 2004-07-30
  • 打赏
  • 举报
回复
applekiller的方法比较简单,也合理。可以用Multimedia MCI 控件播放音乐
sub Timer1_time()
timer1.enable=false
mciExcute()

Private Sub MMControl1_StatusUpdate()
’可在此事件中检查是否播放完,如果播放完了
timer1.enable=true
End Sub
csdnchenxu 2004-07-30
  • 打赏
  • 举报
回复
用 DoEvents 看看吧

在下一条要执行的语句前写
sssss342072 2004-07-30
  • 打赏
  • 举报
回复
用这个做延时:
startime=time
while (time+86400-startime) mod 86400<3; doevents;wend
500毫秒写0。5就行了

lsftest 2004-07-30
  • 打赏
  • 举报
回复
用mciSendString吧。。。。。。。。。。。

'模块中:
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long


'程序中:
Private Sub Command1_Click()
mciSendString "close MyWav", vbNullString, 0, 0
mciSendString "open c:\logoff.wav alias MyWav", vbNullString, 0, 0
mciSendString "play MyWav", vbNullString, 0, 0
Timer1.Interval = 500
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
mciSendString "close MyWav", vbNullString, 0, 0
Timer1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
mciSendString "close MyWav", vbNullString, 0, 0
End Sub

Private Sub Timer1_Timer()
Dim S As String
S = String(256, Chr(0))
mciSendString "status MyWav mode", S, Len(S), 0
If Left(S, 7) = "stopped" Or Left(S, 2) = "停止" Then
Print "播放完毕。"
Timer1.Enabled = False
End If
End Sub

Mars.CN 2004-07-30
  • 打赏
  • 举报
回复
还是学习吧!
mxfeng 2004-07-30
  • 打赏
  • 举报
回复
问问,online 他一定知道。
alicealiceyang 2004-07-30
  • 打赏
  • 举报
回复
同意楼上
加载更多回复(8)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧