本人在做一个监控系统的报警中心客户端。如有报警就及时跳出该监控点的视频。可是有时候视频要等很久才出来,可能是通信慢造成的。为解决此问题,我想在报警信号过来后先放出带有提示正在连接视频标签的窗体,然后连接上就播放视频。原来的代码如下:
首先主窗体回调函数有报警就跳出视频窗体,frmMain.ShowRealVideo(iCtlID);
然后procedure TfrmMain.ShowRealVideo(lCameraID:LongWord);
begin
tmOpenRealVideoWnd.Tag := lCameraID;
tmOpenRealVideoWnd.Enabled := TRUE ;
end;
接着触发定时器
procedure TfrmMain.tmOpenRealVideoWndTimer(Sender: TObject);
var
i : Integer;
begin
tmOpenRealVideoWnd.Enabled := FALSE ;
for i:= 0 to iCount*bs -1 do
begin
if monitorList[i].lCameraID = tmOpenRealVideoWnd.Tag then
begin
if monitorList[i].realVideoWnd = nil then
begin
monitorList[i].realVideoWnd := Tfrmvideo.Create(Self);
monitorList[i].realVideoWnd.Tag := i ; //存放序号
monitorList[i].realVideoWnd.Caption := '实时视频[' + monitorList[i].cMonitorName+']' ;
monitorList[i].realVideoWnd.lbIndex.Caption := IntToStr(monitorList[i].iIndex);
monitorList[i].realVideoWnd.Show ; //frmvideo.ShowModal;
end;
break;
end;
end;
end;
最后进入视频窗体
procedure Tfrmvideo.FormShow(Sender: TObject);
var
m : PBYTE ;
tcpLinkPort : _tcpLinkPortInfo ;
hVideo : HWND;
begin hVideo := pnlVideo.Handle;
iIndex := frmMain.Monitorlist[frmMain.Tag].iIndex;
ELS_CreatePlayWnd(iIndex,hVideo,iIndex);
ELS_ConnectEx(iIndex,PChar(string(frmMain.Monitorlist[frmMain.Tag].cIP)),frmMain.Monitorlist[frmMain.Tag].tcpLinkPort);
ELS_StartVideo(iIndex);
m := @MyCallBack ;
ELS_SetCallBack(iIndex,m)
end;
请问我该在哪个函数里放先放出窗体,那要不要在视频窗体里建个线程建立连接
我建立的线程视频播放不出来。
procedure Tfrmvideo.FormShow(Sender: TObject);
var
m : PBYTE ;
tcpLinkPort : _tcpLinkPortInfo ;
hVideo : HWND;
begin
hVideo := pnlVideo.Handle;
iIndex := frmMain.Monitorlist[frmMain.Tag].iIndex;
ELS_CreatePlayWnd(iIndex,hVideo,iIndex);
LinkVideo:= LinkVideoThread.Create(True);
LinkVideo.Priority := Classes.tpIdle ;
LinkVideo.FreeOnTerminate := True ;
LinkVideo.Resume;
ELS_StartVideo(iIndex);
m := @MyCallBack ;
ELS_SetCallBack(iIndex,m)
lb2.Caption:='视频正在连接中请稍等';
lb2.Visible:=True;
end;
procedure LinkVideoThread.Execute ;
var
tcpLinkPort : _tcpLinkPortInfo ;
begin
While True do
begin
if not Terminated then
begin
frmvideo.lb2.Visible:=False;
ELS_ConnectEx(iIndex,PChar(string(frmMain.Monitorlist[frmMain.Tag].cIP)),frmMain.Monitorlist[frmMain.Tag].tcpLinkPort);
end
else
break;
end;
Sleep(500);
end;
首先主窗体回调函数有报警就跳出视频窗体,frmMain.ShowRealVideo(iCtlID);
然后procedure TfrmMain.ShowRealVideo(lCameraID:LongWord);
begin
tmOpenRealVideoWnd.Tag := lCameraID;
tmOpenRealVideoWnd.Enabled := TRUE ;
end;
接着触发定时器
procedure TfrmMain.tmOpenRealVideoWndTimer(Sender: TObject);
var
i : Integer;
begin
tmOpenRealVideoWnd.Enabled := FALSE ;
for i:= 0 to iCount*bs -1 do
begin
if monitorList[i].lCameraID = tmOpenRealVideoWnd.Tag then
begin
if monitorList[i].realVideoWnd = nil then
begin
monitorList[i].realVideoWnd := Tfrmvideo.Create(Self);
monitorList[i].realVideoWnd.Tag := i ; //存放序号
monitorList[i].realVideoWnd.Caption := '实时视频[' + monitorList[i].cMonitorName+']' ;
monitorList[i].realVideoWnd.lbIndex.Caption := IntToStr(monitorList[i].iIndex);
monitorList[i].realVideoWnd.Show ; //frmvideo.ShowModal;
end;
break;
end;
end;
end;
最后进入视频窗体
procedure Tfrmvideo.FormShow(Sender: TObject);
var
m : PBYTE ;
tcpLinkPort : _tcpLinkPortInfo ;
hVideo : HWND;
begin hVideo := pnlVideo.Handle;
iIndex := frmMain.Monitorlist[frmMain.Tag].iIndex;
ELS_CreatePlayWnd(iIndex,hVideo,iIndex);
ELS_ConnectEx(iIndex,PChar(string(frmMain.Monitorlist[frmMain.Tag].cIP)),frmMain.Monitorlist[frmMain.Tag].tcpLinkPort);
ELS_StartVideo(iIndex);
m := @MyCallBack ;
ELS_SetCallBack(iIndex,m)
end;
请问我该在哪个函数里放先放出窗体,那要不要在视频窗体里建个线程建立连接
我建立的线程视频播放不出来。
procedure Tfrmvideo.FormShow(Sender: TObject);
var
m : PBYTE ;
tcpLinkPort : _tcpLinkPortInfo ;
hVideo : HWND;
begin
hVideo := pnlVideo.Handle;
iIndex := frmMain.Monitorlist[frmMain.Tag].iIndex;
ELS_CreatePlayWnd(iIndex,hVideo,iIndex);
LinkVideo:= LinkVideoThread.Create(True);
LinkVideo.Priority := Classes.tpIdle ;
LinkVideo.FreeOnTerminate := True ;
LinkVideo.Resume;
ELS_StartVideo(iIndex);
m := @MyCallBack ;
ELS_SetCallBack(iIndex,m)
lb2.Caption:='视频正在连接中请稍等';
lb2.Visible:=True;
end;
procedure LinkVideoThread.Execute ;
var
tcpLinkPort : _tcpLinkPortInfo ;
begin
While True do
begin
if not Terminated then
begin
frmvideo.lb2.Visible:=False;
ELS_ConnectEx(iIndex,PChar(string(frmMain.Monitorlist[frmMain.Tag].cIP)),frmMain.Monitorlist[frmMain.Tag].tcpLinkPort);
end
else
break;
end;
Sleep(500);
end;
然后procedure TfrmMain.ShowRealVideo(lCameraID:LongWord);
begin
tmOpenRealVideoWnd.Tag := lCameraID; //将摄像头号付给定时器标签
tmOpenRealVideoWnd.Enabled := TRUE ;
end;
接着触发定时器
procedure TfrmMain.tmOpenRealVideoWndTimer(Sender: TObject);
var
i : Integer;
begin
tmOpenRealVideoWnd.Enabled := FALSE ;
for i:= 0 to iCount*bs -1 do //记录行数
begin
if monitorList[i].lCameraID = tmOpenRealVideoWnd.Tag then //monitorList监控列表
begin
if monitorList[i].realVideoWnd = nil then //realVideoWnd:Tfrmvideo
begin
monitorList[i].realVideoWnd := Tfrmvideo.Create(Self);
monitorList[i].realVideoWnd.Tag := i ; //存放序号
monitorList[i].realVideoWnd.Caption := '实时视频[' + monitorList[i].cMonitorName+']' ;
monitorList[i].realVideoWnd.lbIndex.Caption := IntToStr(monitorList[i].iIndex);
monitorList[i].realVideoWnd.Show ; //frmvideo.ShowModal;
end;
break;
end;
end;
end;
最后进入视频窗体
procedure Tfrmvideo.FormShow(Sender: TObject);
var
m : PBYTE ;
tcpLinkPort : _tcpLinkPortInfo ;
hVideo : HWND;
begin hVideo := pnlVideo.Handle;
iIndex := frmMain.Monitorlist[frmMain.Tag].iIndex;
ELS_CreatePlayWnd(iIndex,hVideo,iIndex); //创建播放窗口
ELS_ConnectEx(iIndex,PChar(string(frmMain.Monitorlist[frmMain.Tag].cIP)),frmMain.Monitorlist[frmMain.Tag].tcpLinkPort); //连接视频
ELS_StartVideo(iIndex);//开始播放
m := @MyCallBack ; //设置回调
ELS_SetCallBack(iIndex,m) //
end;
请问我该在哪个函数里放先放出窗体,那要不要在视频窗体里建个线程建立连接
我建立的线程视频播放不出来。
procedure Tfrmvideo.FormShow(Sender: TObject);
var
m : PBYTE ;
tcpLinkPort : _tcpLinkPortInfo ;
hVideo : HWND;
begin
hVideo := pnlVideo.Handle;
iIndex := frmMain.Monitorlist[frmMain.Tag].iIndex;
ELS_CreatePlayWnd(iIndex,hVideo,iIndex);
LinkVideo:= LinkVideoThread.Create(True);
LinkVideo.Priority := Classes.tpIdle ;
LinkVideo.FreeOnTerminate := True ;
LinkVideo.Resume;
ELS_StartVideo(iIndex);
m := @MyCallBack ;
ELS_SetCallBack(iIndex,m)
lb2.Caption:='视频正在连接中请稍等';
lb2.Visible:=True;
end;
procedure LinkVideoThread.Execute ;
var
tcpLinkPort : _tcpLinkPortInfo ;
begin
While True do
begin
if not Terminated then
begin
frmvideo.lb2.Visible:=False;
ELS_ConnectEx(iIndex,PChar(string(frmMain.Monitorlist[frmMain.Tag].cIP)),frmMain.Monitorlist[frmMain.Tag].tcpLinkPort);
end
else
break;
end;
Sleep(500);
end;
我建立的线程视频播放不出来直接写在onpaint里,不要写在onshow
Form 产生的过程中, 各事件发生与执行的次序,如果是一般的 SDI Form(单文档窗体),各事件的发生次序如下:
OnCreate,OnShow,OnActivate,OnPaint如果是 MDI Form(多文档窗体), 而 MdiChild 的第一个子视窗是在程序启动时就出现在 Mdi Form 中的话,
那么,各事件的次序是:
主视窗的 OnCreate,子视窗的 OnCreate,子视窗的 OnShow,子视窗的 OnActivate,
主视窗的 OnShow (这时在屏幕上看到主视窗及第一个子视窗),主视窗的 OnPaint 顺便说一下,Form 关闭时的事件响应的顺序是:
CloseQuery
OnCloseQuery
Close
OnClose
Deactivate
OnDeactivate
Hide
OnHide
Destroy
OnDestroy