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

Ваш аккаунт

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

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

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

Потоки MFC C++

307
02 февраля 2009 года
Artem_3A
863 / / 11.04.2008
Стоит задача отправить в новый поток функцию OpenFile, являющуюся в свою очередь членом класса CCompFileDlg. Пытаюсь реализовать это следующи образом, пишу функцию-обертку дружественую классу CCompFileDlg
 
Код:
UINT procOpenFile(LPVOID Param)
{
    CCompFileDlg* pDlg = ((CCompFileDlg*)Param);
    pDlg->OpenFile();
    pDlg->UpdateData(FALSE);
    return 0;
}


реализация функции 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;
        }
    }
}


работаю с потоком следующим образом

 
Код:
void CCompFileDlg::OnOpenOpenfirst()
{
    CWinThread* pOpenThread = new CWinThread(procOpenFile, this);
    pOpenThread->CreateThread();
    //UpdateData(FALSE);
}


Собственно проблема в том что при попытки обновить данные в процессе вылетает ошибка? Подскажите что я делаю нет так? И если есть более изящное решение то буду очень благодарен за совет!
11
02 февраля 2009 года
oxotnik333
2.9K / / 03.08.2007
брейкпоинт на строке
UpdateData(FALSE);(в данном месте возникает ошибка)
и F11 смотреть что где вызывается неинициализированным
341
03 февраля 2009 года
Der Meister
874 / / 21.12.2007
[QUOTE=Artem_3A]Собственно проблема в том что при попытки обновить данные в процессе вылетает ошибка?[/QUOTE]Насколько я помню, ddx может использовать только поток, породивший окно. Если это так, то вводите событие, сигнализирующее о необходимости обновить данные диалога.
307
04 февраля 2009 года
Artem_3A
863 / / 11.04.2008
Цитата: Der Meister
Насколько я помню, ddx может использовать только поток, породивший окно. Если это так, то вводите событие, сигнализирующее о необходимости обновить данные диалога.



В таком случае я так понимаю стоит использовать не рабочие потоки а потоки пользовательского интерфейса. Спасибо всем за ответы.

288
04 февраля 2009 года
nikitozz
1.2K / / 09.03.2007
Вообще в MFC обычно возникают проблемы, когда в рабочий поток передаешь указатель на потомок CWnd и пытаешься с ним что-то делать. Как правило лучше не взаимодействовать с UI из рабочего потока или взаимодействовать с помощью сообщений.
311
05 февраля 2009 года
plastictown
309 / / 08.01.2006
Вопрос не совсем по теме:
В чем разница:
1.
Цитата:

 
Код:
CWinThread* pOpenThread = new CWinThread(procOpenFile, this);
pOpenThread->CreateThread();


2.

 
Код:
CWinThread* pOpenThread=AfxBeginThread(бла бла бла);
14
05 февраля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: 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]
-----

311
06 февраля 2009 года
plastictown
309 / / 08.01.2006
Нифигасе! Пойду в переводчик загляну. Спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог