Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Передвать из одного потока в другой поток данные н


Автор: 2faust 9.7.2009, 16:09
все привет.

тут столкнулся с маленькой проблеммой. когда передаю данные на форму, дальше при появлении формы выскакивает ошибка.
проблема наверное заклячается в том, что не передаю адресс родителя в форму. а как надо правильно сделать?
если данные на форму не передавать форма появляется без всяких проблем.

вот пример :

Код

// главный поток
CX::OnButton1()
{
        // в потоке 1 создаю поток 2
        pThreadInitDialog = ::AfxBeginThread(InitDialog, this, THREAD_PRIORITY_NORMAL);
        ...
        for(...)
        {
                ...
                
                // формирую данные, которые должны попасть на форму потока 2
                struct_1.x  = m_str1;
                struct_1.y  = m_str2;
                struct_1.z  = bBool ? "TRUE" : "FALSE";
        
                this->PostMessage(TRANSFER_DATA, 0, 0);
                ...
        }
}


Код

UINT CX::InitDialog(LPVOID pParam)
{
    CX* pXDlg = reinterpret_cast<CXDlg*>(pParam);

    long filesize = 0;
    CString m_strfilesize = "";
    pXDlg->GetDlgItemText(IDC_EDIT_MBORMIN, m_strfilesize);
    filesize = _ttoi(m_strfilesize);

    CInitDialog obg(filesize, pXDlg);

    obg.DoModal();

    
    return 0;
}


Код

LRESULT CX::OnMessageTransferData(WPARAM wParam, LPARAM lParam)
{
    // данные должны появиться на форме
    obg2.m_X.SetWindowText(struct_1.x); // вот здесь выскакивает ошибка !
    obg2.m_Y.SetWindowText(struct_1.y);
    obg2.m_Z.SetWindowText(struct_1.z);

    return LRESULT();
}

Автор: Earnest 10.7.2009, 07:17
Цитата(2faust @  9.7.2009,  17:09 Найти цитируемый пост)
this->PostMessage(TRANSFER_DATA, 0, 0);

Что-то я не заметила, что ты что-то передаешь... скорее сообщаешь о заполнении глобальной переменной, так что ли? 
Цитата(2faust @  9.7.2009,  17:09 Найти цитируемый пост)
 CX* pXDlg = reinterpret_cast<CXDlg*>(pParam);

Вот так делать нехорошо: объекты CWnd валидны только в создающем их потоке. Часть функций может ругаться ассертами.
Опять же, первая функция и последняя являются обработчиками одного и того же класса-окна. Поэтому по-любому выполняются в одном потоке. Где тут передача из потока в поток?
Еще, поток ты создаешь рабочий, но пытаешься создать в нем окно и запустить модальный цикл. Тоже неправильно.
Ты описал бы постановку задачи, чтобы можно было конкретно советовать.

Автор: 2faust 13.7.2009, 14:06
добрый.
дело в том что у меня есть основные потоки и рабочие потоки.
в основном потоке запускаю ф-цию CX::OnButton1(), та в свою очередь запускает рабочий поток ::AfxBeginThread(InitDialog, ...) смысл которого явл-ся передать форму в отдельную нить. 
дальше в эту нить мне надо передавать данные из основного потока ч\з ф-цию CX::OnMessageTransferData(), в которой формирую данные. 
в основном потоке диалог. модальн. окно не могу запускать так же как и использов. ф-цию CX::OnMessageTransferData() их работу будет блокировать waitforsingleobject в основном потоке.

Цитата

this->PostMessage(TRANSFER_DATA, 0, 0);


с этим я конечно переборщил. был не прав. пытаюсь передать сообщение с основоной же поток.

Автор: Earnest 14.7.2009, 07:01
Цитата(2faust @  13.7.2009,  15:06 Найти цитируемый пост)
смысл которого явл-ся передать форму в отдельную нить. 

Еще раз повторю: окна нормально работают только в специальный потоках (не помню название) но никак не в рабочих! Поток с окном должен иметь цикл обработки сообщений... Можно, конечно, попробавать запустить в рабочем потоке модальный цикл, но это какой-то ущербный вариант. Хочешь окно в отдельном потоке - создавай правильный поток.

Автор: 2faust 14.7.2009, 08:44
2 Earnest

я буду вам очень благодарен за помощь если вы приведете отдельный пример, как реализовать для отдельного окна в рабочем потоке цикл обработки сообщений.

за неимением опыта не знаю как это реализовать.  smile 

Автор: Earnest 14.7.2009, 16:46
В рабочем потоке нельзя реализовать цикл обработки сообщений, на то он и рабочий, т.е. управляется однй процедурой.
UI-поток тоже запускается функцией AfxBeginThread, но ее вторым вариантом - где первым параметром стоит CRuntimeClass*. Предполагается, что это класс объекта производного от CWinThread, в котором и критится цикл обработки сообщений. Примера под рукой нет. Почитай в MSDN статью "Multithreading: Creating User-Interface Threads". 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)