本人在做一个监控系统的报警中心客户端。如有报警就及时跳出该监控点的视频。可是有时候视频要等很久才出来,可能是通信慢造成的。为解决此问题,我想在报警信号过来后先放出带有提示正在连接视频标签的窗体,然后连接上就播放视频。原来的代码如下:
首先主窗体回调函数有报警就跳出视频窗体,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;

解决方案 »

  1.   

      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 //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; 
      

  2.   

    请问我该在哪个函数里放先放出窗体,那要不要在视频窗体里建个线程建立连接 
    我建立的线程视频播放不出来直接写在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