Проигрывание avi во время выполнения рабочего потока
Цитата:
// CAviViewCopy dialog
class CAviViewCopy : public CDialog
{
// Construction
public:
CAviViewCopy(CWnd* pParent = NULL); // standard constructor
CAviViewCopy::~CAviViewCopy();
void SetCaption(char *Caption);
virtual void OnCancel(void);
// Dialog Data
//{{AFX_DATA(CAviViewCopy)
enum { IDD = IDD_VIEW_AVI_COPY };
CAnimateCtrl m_Avi_Copy;
//}}AFX_DATA
char *lpCaption;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAviViewCopy)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CAviViewCopy)
afx_msg void HandlerAnimateCopyStop();
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif
AviViewCopy.cpp
Цитата:
extern CRml4App theApp;
// CAviViewCopy dialog
CAviViewCopy::CAviViewCopy(CWnd* pParent /*=NULL*/)
: CDialog(CAviViewCopy::IDD, pParent)
{
//{{AFX_DATA_INIT(CAviViewCopy)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CAviViewCopy::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAviViewCopy)
DDX_Control(pDX, IDR_AVI_COPY, m_Avi_Copy);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAviViewCopy, CDialog)
//{{AFX_MSG_MAP(CAviViewCopy)
//}}AFX_MSG_MAP
ON_CONTROL(ACN_STOP, IDR_AVI_COPY, HandlerAnimateCopyStop)
END_MESSAGE_MAP()
// CAviViewCopy message handlers
void CAviViewCopy::HandlerAnimateCopyStop()
{
Sleep(350);
m_Avi_Copy.Play(0, (UINT)-1, 1);
}
void CAviViewCopy::OnCancel(void)
{
CDialog::OnCancel();
}
void CAviViewCopy::SetCaption(char *Caption)
{
lpCaption = Caption;
}
BOOL CAviViewCopy::OnInitDialog()
{
CDialog::OnInitDialog();
this->SetWindowText( lpCaption );
m_Avi_Copy.Open(IDR_AVI_COPY);
m_Avi_Copy.Play(0, (UINT)-1, 1);
::ResumeThread( theApp.hThrd );
SetEvent( theApp.isDialogInit );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
CAviViewCopy::~CAviViewCopy()
{
DestroyWindow();
}
Вызов функции
Цитата:
void wdCountofWordsThread( char *SourceDir )
{
::WaitForSingleObject( theApp.isDialogInit, INFINITE );
try
{
....................................
theApp.Result = 0x00;
((CAviViewCopy*)theApp.dlg)->OnCancel();
ExitThread( 0x00 );
}
catch( const std::exception& error )
{
theApp.Result = 0xFFFFFFFF;
theApp.glErrStr = error.what();
((CAviViewCopy*)theApp.dlg)->OnCancel();
ExitThread( 0xFFFFFFFF );
}
}
//---------------------------------------------------------------------------------------------
DWORD wdCountofWords( char *SourceDir, int MinorCode, int MajorCode )
{
theApp.MinorCode = MinorCode;
theApp.MajorCode = MajorCode;
theApp.Result = 0;
theApp.glErrStr = string();
theApp.isDialogInit = CreateEvent( NULL, true, false, "DialogInit" );
theApp.dlg = (CAviViewCopy*)new CAviViewCopy;
((CAviViewCopy*)theApp.dlg)->SetCaption("Идет подсчёт слов...");
DWORD lpThreadId = 0;
theApp.hThrd = ::CreateThread( NULL,
0,
(LPTHREAD_START_ROUTINE)wdCountofWordsThread,
(LPVOID)SourceDir,
CREATE_SUSPENDED,
&lpThreadId );
((CAviViewCopy*)theApp.dlg)->DoModal();
if( !theApp.glErrStr.empty() )
::MessageBox( NULL, theApp.glErrStr.c_str(), "Ошибка", MB_OK|MB_ICONERROR|MB_SYSTEMMODAL );
int tst = CloseHandle( theApp.isDialogInit );
((CAviViewCopy*)theApp.dlg)->CloseWindow();
delete theApp.dlg;
theApp.dlg = NULL;
int tst2 = CloseHandle( theApp.hThrd );
theApp.glErrStr = string();
return theApp.Result;
// return 0;
}
{
::WaitForSingleObject( theApp.isDialogInit, INFINITE );
try
{
....................................
theApp.Result = 0x00;
((CAviViewCopy*)theApp.dlg)->OnCancel();
ExitThread( 0x00 );
}
catch( const std::exception& error )
{
theApp.Result = 0xFFFFFFFF;
theApp.glErrStr = error.what();
((CAviViewCopy*)theApp.dlg)->OnCancel();
ExitThread( 0xFFFFFFFF );
}
}
//---------------------------------------------------------------------------------------------
DWORD wdCountofWords( char *SourceDir, int MinorCode, int MajorCode )
{
theApp.MinorCode = MinorCode;
theApp.MajorCode = MajorCode;
theApp.Result = 0;
theApp.glErrStr = string();
theApp.isDialogInit = CreateEvent( NULL, true, false, "DialogInit" );
theApp.dlg = (CAviViewCopy*)new CAviViewCopy;
((CAviViewCopy*)theApp.dlg)->SetCaption("Идет подсчёт слов...");
DWORD lpThreadId = 0;
theApp.hThrd = ::CreateThread( NULL,
0,
(LPTHREAD_START_ROUTINE)wdCountofWordsThread,
(LPVOID)SourceDir,
CREATE_SUSPENDED,
&lpThreadId );
((CAviViewCopy*)theApp.dlg)->DoModal();
if( !theApp.glErrStr.empty() )
::MessageBox( NULL, theApp.glErrStr.c_str(), "Ошибка", MB_OK|MB_ICONERROR|MB_SYSTEMMODAL );
int tst = CloseHandle( theApp.isDialogInit );
((CAviViewCopy*)theApp.dlg)->CloseWindow();
delete theApp.dlg;
theApp.dlg = NULL;
int tst2 = CloseHandle( theApp.hThrd );
theApp.glErrStr = string();
return theApp.Result;
// return 0;
}
Технология следующая: Вызывается функция из dll wdCountofWords. Она создаёт диалог с авишкой, который ждёт события DialogInit. Как только диалог создан и событие послано, запускается рабочий поток и в бесконечном цикле крутится авишка. После завершения работы, рабочий поток посылает диалогу команду завершиться.
В чём может быть неточность реализации задуманного??? (В принципе вроде работает, но хотелось бы услышать мнение со стороны).