Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Почему не доходит PostThreadMessage?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С диалога посылаю PostThreadMessage классу - наследнику CWinThread
 
Для этого:
 
1. В *.h - файл добавил МЕЖДУ  
//}}AFX_MSG
И
DECLARE_MESSAGE_MAP()
обьявление функции, которая будет вызываться при получении сообщения
прототип:
afx_msg void OnSomeMessage(...);
 
2. В *.cpp вставил макрос ON_THREAD_MESSAGE(...) между
//}}AFX_MSG_MAP
и
END_MESSAGE_MAP()
 
3. Написал ее (функции) определение в *.cpp  
 
В дебагере вижу, что сообщение посылается по правильному m_nThreadID, но в обработчик сообщения не попадает...  
 
Для #define своего сообщения вместо WM_USER + ... использовал и WM_APP + ...
 
Не помогло.    
 
Почему не доходит PostThreadMessage?

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 08:31 13-06-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При этом, даже в CWinThread::PreTranslateMessage не попадаю,
а thread крутится в своем законном Run().

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 07:50 14-06-2004
c0r0ner



злобный доктор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Этому может быть несколько причин:
1. Попробуй выбирать сообщения принудительно т.е. PeekMessage;
2. Если ты посылаешь сообщение из приложения, которому не пренадлежит класс потока, то учти что чистема постылает сообщения от 0 до WM_USER и тебе придется применять маршалинг.  
Вобщем поэксперементируй, и внимательно почитай MSDN.

Всего записей: 742 | Зарегистр. 09-12-2001 | Отправлено: 09:02 14-06-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eсли закрываю ::Run() все работает как надо...
 
Добавлено
c0r0ner
Где ты взял что я посылаю сообщение из приложения, которому не пренадлежит класс потока?

Цитата:
внимательно почитай MSDN

Зачем же так? Отделываться общей фразой легче всего.
 
 
Добавлено
Комментирую в Run() цикл While(1) с работой и Sleep(...) в конце и все работает ОК.
Я могу обойтись без PostThreadMessage, вызвав через указатель функции класса - наследника CWinThread, но охота разобраться где ''грабли''?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 09:03 14-06-2004
c0r0ner



злобный доктор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83

Цитата:
Где ты взял что я посылаю сообщение из приложения, которому не пренадлежит класс потока?

Я написал если может быть случайно ты так делаешь.
 

Цитата:
цикл While(1) с работой и Sleep(...)  

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

Всего записей: 742 | Зарегистр. 09-12-2001 | Отправлено: 10:23 14-06-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
c0r0ner
Taк внутри CWinThread::Run() есть while(PeekMessage(....))
Понятно, что если поменять на CWinThread::Run() внутри цикла while(1) все будет работать...
В том то и дело, что читал где-то, что если работает CWinThread::Run() это сильно сказывается на скорости, а здесь это важно.
 


----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 12:18 14-06-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
можешь кинуть приложение мне (в укороченном вмде) - посмотрю (адрес в ПМ)

Цитата:
//}}AFX_MSG  

-это вроде от 6.0 - может стоит попробовать перейти на 7.1 и выбросить все эти извращения
----
p.s. - у меня сейчас приложение с 3 потоками от cwinthread и одним обычным и все работает нормально
 
Добавлено
Упс - не то написал:
1 я использовал PostThreadMessage от самого CWinThread т.е. чистыми api не пользовался
2 PostThreadMessage из CWinThread  вызывает стандартную api PostThreadMessage с параметром m_nThreadID - по идее все должно работать

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 14:06 14-06-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
Taк с этим проблем нет.
PostThreadMessage работает без проблем.
Речь только идет об альтернативе цикла выборки сообщений (без вызова CWinThread::Run() )...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 17:14 14-06-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Не совсем понял вопрос
вот то что понял:
1) перекрыл Run  
2) обрабатываешь PeekMessage самостоятельно (в принципе если не нужны доп. действия при простое (без сообщений), то можно и GetMessage)
3) после приема сообщения сам выполняешь маршрутизацию по MFC таблице
 
вопрос: где нет сообщения?
 
Добавлено
Есть подозрение, что не сделан 3) - он реализован (по-моему) в CWinThread::Run

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 00:01 15-06-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
При открытом отцовском CWinThread::Run в конце цикла  
    while(1)
    {
        .......................
        if (m_pDlg && (::IsWindow(m_pDlg->m_hWnd)))
            m_pDlg->PostMessage(WM_USER_READ_DEVICE);
 
        Sleep(DELAY_TO_READING);
        CWinThread::Run();  
    }
никаких проблем нет, но в нем много лишнего (сказывается на скорости, а здесь это важно)...
Вопрос снимается.

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 07:03 15-06-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
хоть вопрос и снят...

Цитата:
while(1)
    {
        .......................
        if (m_pDlg && (::IsWindow(m_pDlg->m_hWnd)))
            m_pDlg->PostMessage(WM_USER_READ_DEVICE);
 
        Sleep(DELAY_TO_READING);
        CWinThread::Run();  
    }  

в CWinThread::Run уже есть свой цикл обработки c бесконечным for. так что этот вариант масло масленное - твой цикл более 1 раза работать не будет

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 09:12 15-06-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex

Цитата:
CWinThread::Run уже есть свой цикл обработки c бесконечным for. так что этот вариант масло масленное

Согласен. Поэтому и отказался от этой идеи.
Все сделал ''дедовским'' методом.

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 18:51 15-06-2004 | Исправлено: mihas83, 18:53 15-06-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Почему не доходит PostThreadMessage?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru