Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передвать из одного потока в другой поток данные н 
:(
    Опции темы
2faust
Дата 9.7.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



все привет.

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

вот пример :

Код

// главный поток
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();
}

PM MAIL   Вверх
Earnest
Дата 10.7.2009, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(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 валидны только в создающем их потоке. Часть функций может ругаться ассертами.
Опять же, первая функция и последняя являются обработчиками одного и того же класса-окна. Поэтому по-любому выполняются в одном потоке. Где тут передача из потока в поток?
Еще, поток ты создаешь рабочий, но пытаешься создать в нем окно и запустить модальный цикл. Тоже неправильно.
Ты описал бы постановку задачи, чтобы можно было конкретно советовать.


--------------------
...
PM   Вверх
2faust
Дата 13.7.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



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

Цитата

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


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

Это сообщение отредактировал(а) 2faust - 13.7.2009, 14:06
PM MAIL   Вверх
Earnest
Дата 14.7.2009, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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


--------------------
...
PM   Вверх
2faust
Дата 14.7.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



2 Earnest

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

за неимением опыта не знаю как это реализовать.  smile 
PM MAIL   Вверх
Earnest
Дата 14.7.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.