UINT procOpenFile(LPVOID Param)
{
CCompFileDlg* pDlg = ((CCompFileDlg*)Param);
pDlg->OpenFile();
pDlg->UpdateData(FALSE);
return 0;
}
Потоки MFC C++
Код:
реализация функции OpenFile
Код:
void CCompFileDlg::OpenFile(void)
{
CFileDialog OpenDlg(TRUE);
if(OpenDlg.DoModal()!=IDOK)
return;
CString FilePath = OpenDlg.GetPathName();
CFile* pFile = new CFile(FilePath, CFile::modeRead);
try
{
int iCountReadsBytes = 0;
while( 0< (iCountReadsBytes = pFile->Read(pBuffer, iSizeBuffer)) )
{
for(int iIndex = 0; iIndex<iCountReadsBytes; iIndex++)
{
CString strHex(_T(""));
if(!iIndex)
strHex.Format(_T("%2.2X"), pBuffer[iIndex]);
else if(iIndex%16==0)
strHex.Format(_T("\r\n%2.2X"), pBuffer[iIndex]);
else if(iIndex%8==0)
strHex.Format(_T("-%2.2X"), pBuffer[iIndex]);
else
strHex.Format(_T(" %2.2X"), pBuffer[iIndex]);
szFirstFile += strHex;
}
szFirstFile += _T("\r\n");
}
pFile->Close();
delete pFile;
//UpdateData(FALSE);(в данном месте возникает ошибка)
}
catch(CFileException* pExc)
{
pExc->ReportError();
if(!pFile)
{
pFile->Close();
delete pFile;
}
}
}
{
CFileDialog OpenDlg(TRUE);
if(OpenDlg.DoModal()!=IDOK)
return;
CString FilePath = OpenDlg.GetPathName();
CFile* pFile = new CFile(FilePath, CFile::modeRead);
try
{
int iCountReadsBytes = 0;
while( 0< (iCountReadsBytes = pFile->Read(pBuffer, iSizeBuffer)) )
{
for(int iIndex = 0; iIndex<iCountReadsBytes; iIndex++)
{
CString strHex(_T(""));
if(!iIndex)
strHex.Format(_T("%2.2X"), pBuffer[iIndex]);
else if(iIndex%16==0)
strHex.Format(_T("\r\n%2.2X"), pBuffer[iIndex]);
else if(iIndex%8==0)
strHex.Format(_T("-%2.2X"), pBuffer[iIndex]);
else
strHex.Format(_T(" %2.2X"), pBuffer[iIndex]);
szFirstFile += strHex;
}
szFirstFile += _T("\r\n");
}
pFile->Close();
delete pFile;
//UpdateData(FALSE);(в данном месте возникает ошибка)
}
catch(CFileException* pExc)
{
pExc->ReportError();
if(!pFile)
{
pFile->Close();
delete pFile;
}
}
}
работаю с потоком следующим образом
Код:
void CCompFileDlg::OnOpenOpenfirst()
{
CWinThread* pOpenThread = new CWinThread(procOpenFile, this);
pOpenThread->CreateThread();
//UpdateData(FALSE);
}
{
CWinThread* pOpenThread = new CWinThread(procOpenFile, this);
pOpenThread->CreateThread();
//UpdateData(FALSE);
}
Собственно проблема в том что при попытки обновить данные в процессе вылетает ошибка? Подскажите что я делаю нет так? И если есть более изящное решение то буду очень благодарен за совет!
UpdateData(FALSE);(в данном месте возникает ошибка)
и F11 смотреть что где вызывается неинициализированным
[QUOTE=Artem_3A]Собственно проблема в том что при попытки обновить данные в процессе вылетает ошибка?[/QUOTE]Насколько я помню, ddx может использовать только поток, породивший окно. Если это так, то вводите событие, сигнализирующее о необходимости обновить данные диалога.
Цитата: Der Meister
Насколько я помню, ddx может использовать только поток, породивший окно. Если это так, то вводите событие, сигнализирующее о необходимости обновить данные диалога.
В таком случае я так понимаю стоит использовать не рабочие потоки а потоки пользовательского интерфейса. Спасибо всем за ответы.
Вообще в MFC обычно возникают проблемы, когда в рабочий поток передаешь указатель на потомок CWnd и пытаешься с ним что-то делать. Как правило лучше не взаимодействовать с UI из рабочего потока или взаимодействовать с помощью сообщений.
В чем разница:
1.
Цитата:
Код:
CWinThread* pOpenThread = new CWinThread(procOpenFile, this);
pOpenThread->CreateThread();
pOpenThread->CreateThread();
2.
Код:
CWinThread* pOpenThread=AfxBeginThread(бла бла бла);
Цитата: plastictown
В чем разница:
[QUOTE=MSDN]
Instead of calling AfxBeginThread, you can construct a CWinThread-derived object and then call CreateThread. This two-stage construction method is useful if you want to reuse the CWinThread object between successive creation and terminations of thread executions.
[/QUOTE]
-----
Нифигасе! Пойду в переводчик загляну. Спасибо!