Mediaplayer播放过程中怎么发送数据包?

walw521 2010-09-28 10:02:02
小弟写了个程序,用MediaoPlayer控件循环播放一段视频,在播放过程中的一些特殊时刻要向串口发送数据包,同时要响应键盘按下事件。下面是主要代码,在PlayMedia()中用一个死循环来监控视频播放过程,但这样程序就不能响应键盘事件了;另外我试了一下新建一个线程来执行望PlayMedia()中的代码,但是新线程中MediaPlayer1->Position 的值一直不变,高手指点一下!谢谢了!

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnMessage = Form1->AppMessage;
}
/********************监控键盘按键消息**********************/
void __fastcall TForm1::AppMessage(tagMSG& msg,bool& Handled)
{
if(msg.message==WM_KEYDOWN){
int key = (int) msg.wParam;
if(key==VK_ESCAPE) //Esc键按下,退出程序
{
MediaPlayer1->Stop() ;
stop=true;
Sleep(1);
this->Close() ;
}
}

}
void __fastcall TForm1:: PlayMedia()
{
FILE *inputfile;
char *p;
int sendtime;
int lastsendtime;
int position;
char temp[10];
sendtime=0;
lastsendtime=0;
inputfile=fopen("D:\\test.txt","r");

Form1->Panel1->Enabled =true;
Form1->Panel1->Visible =true;
Form1->BorderStyle = bsNone;
Form1->WindowState =wsMaximized;
Form1->Panel1-> Left = 0;
Form1->Panel1-> Top = 0;
Form1->Panel1-> Width = Screen->Width ;
Form1->Panel1-> Height = Screen->Height ;
Form1->MediaPlayer1->Open();
Form1->MediaPlayer1->DisplayRect=Rect(0,0,Screen->Width, Screen->Height);

Form1->MediaPlayer1->Play();
while(!stop)
{
/*********读取文件(存放需要向串口发送数据的时刻表)*****/
if(feof(inputfile)) fseek(inputfile,0,SEEK_SET);
else
{
fgets(line,256,inputfile);
p=strtok(line,"\t");
if(p!=NULL) strcpy(crossid,p);
p=strtok(NULL,"\t");
if(p!=NULL) sendtime=atoi(p); //sendtime 要向串口发送数据的时刻
}

position= Form1->MediaPlayer1->Position /20 ;
while((position >=lastsendtime)&&(position <sendtime))
{
Sleep(1000);
position= Form1->MediaPlayer1->Position /20 ;
}
if(Form1->MediaPlayer1->Position < Form1->MediaPlayer1->Length )
{
writeToPort(); //串口发送数据
lastsendtime=sendtime;
}
}

}
/********视频播放完,进行循环播放**********/
void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender)
{
if(MediaPlayer1->Position ==MediaPlayer1->Length )
{
PlayMedia();
}
}
oid __fastcall TForm1::Button1Click(TObject *Sender)
{
stop=false;
// mythread=new MyThread(true);
// mythread->FreeOnTerminate=true;
PlayMedia();
}
...全文
86 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
walw521 2010-10-07
  • 打赏
  • 举报
回复
哎!结贴了!最后用了两个定时器解决了问题!以后有时间再试试原来的方法!多谢楼上大侠指点!
BORLANDSUN 2010-10-06
  • 打赏
  • 举报
回复
1。在PlayMedia()中用一个死循环来监控视频播放过程,但这样程序就不能响应键盘事件了;
你要在循环里取消息,然后来响应出现的键盘事件。死循环是不行的,程序没有机会处理消息。

2。另外我试了一下新建一个线程来执行望PlayMedia()中的代码,但是新线程中MediaPlayer1->Position 的值一直不变。
你无法得知PlayMedia()所在控件的线程模型,它也许和你理解方式是不同的,或者内部存在异常。至少从目前的代码看,VCL组件Form1等出现在你的线程函数中是不安全的。你可以使用同步化函数来执行Form1的显示。

adamsos 2010-10-06
  • 打赏
  • 举报
回复
网店货源游戏点卡网店代理手机话费网店代理QQ业务网店代理

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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