线程中使用vcl的MediaPlayer控件播放一个mp3,程序退出时间出现“无效的窗口句柄”,如何解决? ( 积分: 100 )

  • 主题发起人 主题发起人 lxw5214
  • 开始时间 开始时间
L

lxw5214

Unregistered / Unconfirmed
GUEST, unregistred user!
详细说明:
在主线程满足一定条件时,创建一个线程播放指定mp3文件,(有可能同一时间内创建多个这样的线程,当然,播发的代码是在临界区内的)因为主线程不能被打断,所以不想用synchronize,但这样关闭程序时提示“无效的窗口句柄”。不创建线程就没有,请问如何解决?(有没有支持线程的MP3播放控件?)
 
详细说明:
在主线程满足一定条件时,创建一个线程播放指定mp3文件,(有可能同一时间内创建多个这样的线程,当然,播发的代码是在临界区内的)因为主线程不能被打断,所以不想用synchronize,但这样关闭程序时提示“无效的窗口句柄”。不创建线程就没有,请问如何解决?(有没有支持线程的MP3播放控件?)
 
MediaPlayer本身播放的时候就是线程播放吧?
 
阿?那怎么会出现这个问题呢?如果不创建这个播放语音线程就没事阿
 
你可能关闭的时候mp3还是处于播放状态啊,也就是线程没有结束,既然线程没有结束,肯定要等线程结束才能关闭了,你这么关能不出问题吗?
 
同意cqwty
 
关闭时已经播放完毕,但不知线程是否结束释放。使用TxxxThread.create();创建。execute里只有一个播放过程,应该执行完就释放了(已经FreeonTerminate := true了)
 
我觉得播放mp3并没有对相应的文件进行修改,而只是访问,所以没有必要加入临界区吧。除非是出现要对文件进行修改的情况,加入临界区控制一下倒是必须的。还有,你把你的播放的线程代码贴出来看看,问题应该就在这里面,这么猜是猜不出来的。
 
因为可能有多个这样的线程,需要按顺序播放,所以加临界区。
播放代码:
procedure Threadxx.play;
begin
进入临界区
from1.mediaplayer1.close;
form1.mediaplayer1.filename := 'Mp3路径+文件名.mp3';
fomr1.mediaplayer1.open;
form1.mediaplayer1.player;
sleep(form1.mediaplayer1.length);
离开临界区
end;
procedure Threadxx.execute;
begin
play;
//synchronize(play);
end;
 
首先给你纠正一个问题,你的所有线程都在调用form1上的mediaplayer1来播放,
你现在想象一下,如果几个线程同时抢一个资源,也就是form1中的mediaplayer1,那是什么后果呢?错误就是在这里,播放mp3的代码或者控件很多,而且可以不是图形化的vcl的,所以你这个肯定错误。明白吧!
 
谢谢楼上。
我知道资源问题,所以我用了临界区,这样只有一个线程不用这个资源时,另一个线程才能使用。不会同时几个线程在使用的。
 
一女嫁二(N)夫
 
我知道你要说的是你用的form1.mediaplayer1是放在临界区的意思了,所以你觉得这个不会影响了,可是你要记住,你这个是可视化vcl,而且只有一个,你每个线程创建完毕,就已经锁定了这块资源,只是等待对方释放,然后自己使用而已了。对于非可视化的,使用临界区是不错,但是可视化的vcl不是临界区这么简单吧。
 
所以我想知道该如何解决这个问题呢?请给出解决问题的方法吧,在线程里创建一个TMediaPlayer实例可以吗?
 
在多线程里面创建一个tmediaplayer是不可能的,因为不要指定parent才可以,所以解决的办法就是换一个非可视化的mp3播放控件来做,这样可以满足了。
 
能推荐一个非可视的Mp3播放控件吗?
 
没结果,打击提问积极性了,再不提问了。
 
多人接受答案了。
 
后退
顶部