Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проигрывание avi во время выполнения рабочего потока

1.5K
15 февраля 2005 года
backspace
2 / / 20.08.2000
AviViewCopy.h
Цитата:

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



Технология следующая: Вызывается функция из dll wdCountofWords. Она создаёт диалог с авишкой, который ждёт события DialogInit. Как только диалог создан и событие послано, запускается рабочий поток и в бесконечном цикле крутится авишка. После завершения работы, рабочий поток посылает диалогу команду завершиться.

В чём может быть неточность реализации задуманного??? (В принципе вроде работает, но хотелось бы услышать мнение со стороны).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог