Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановка динамического рисования, при организации "модели пользователя" 
V
    Опции темы
Kuvaldis
Дата 29.7.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



Всем доброго времени суток!

Есть программа, которая при выборе из меню пункта запускает или останавливает движение объекта по окну. Причем движение не останавливается при вызове всяких MessageBox() и меню (т.е. системные сообщения от таймера доходят). При реализации модели пользователя, когда программно выполняются действия, движение прерывается. Не совсем понимаю, почему. Хотелось бы узнать, как сделать так, чтобы прерываний не было
Организую начало демонстрационного режима по WM_ENTERIDLE. 
Прикрепляю проект.
Был бы рад услышать конструктивную критику smile

P.S. Не бейте ногами, если вопрос слишком простой 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  MinModif.zip 8,01 Kb


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
jonie
Дата 29.7.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата

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

 Хотелось бы узнать, как сделать так, чтобы прерываний не было
запустить Thread для выполнения действия...?

ЗЫ: в проект *.vcproj тоже стоит прикреплять....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Kuvaldis
Дата 30.7.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



jonie, 
Как я понял, тут без нового потока никак...
Цитата

ЗЫ: в проект *.vcproj тоже стоит прикреплять....

мдя... забыл :(
Цитата

запустить Thread для выполнения действия.

С Тредами до этого не работал. Вот что-то наваял, но... теперь не обрабатывается WM_KEYDOWN в треде, чтобы был переход по пунктам меню и нажатие ENTER :(
Сделал так:
В функции окна:
Код

case WM_ENTERIDLE:
            if ( demo )    // только если установлен режим обучения
            {
                MSG myMsg;
                myMsg.hwnd = hwnd;
                myMsg.lParam = lParam;
                myMsg.wParam = wParam;
                myMsg.message = msg;
                DWORD id;
                CreateThread( NULL, NULL, &ThreadProc, &myMsg, NULL, &id );
            //    OnEnterIdle( hwnd, msg, wParam, lParam );
            }
            break;


В модуле с функцией треда. Т.е. формально саму функцию OnEnterIdle() я вообще не трогал
В чем может быть проблема?
Код

//---------------------------------------------------------------------------------------------
extern int demo;
//---------------------------------------------------------------------------------------------
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
    MSG  msg = * ( ( MSG* ) lpParameter );

    OnEnterIdle( msg.hwnd, msg.message, msg.lParam, msg.wParam );
    return 0;
}
//---------------------------------------------------------------------------------------------
// сообщение приходит после того, как меню отображено на экране

void OnEnterIdle( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    if ( wParam != MSGF_MENU )
        return;

    HWND menuWnd = ( HWND )lParam;        // дескриптор окна меню (НЕ окна приложения)

    switch ( demo )
    {
        case 1:
            Delay( 1500 );        // задержка 
            SendMessage( menuWnd, WM_KEYDOWN, VK_DOWN, 0x1500001 );
            Delay( 1500 );        // задержка 
            SendMessage( menuWnd, WM_KEYDOWN, VK_RETURN, 0x1500001 );
            break;

        case 2:        // показать, что пункт Load не активен
            Delay( 1500 );
            PostMessage( menuWnd, WM_LBUTTONDOWN, 0, 0 );
            break;

        case 3:
            // пункт Обучение активизирует запуск колеса
            PrintString( hwnd, 10, 1, "Для запуска движения колеса" );
            PrintString( hwnd, 10, 2, "Необходимо вызвать подменю Work" );
            Delay( 2000 );        // задержка 
            PrintString( hwnd, 10, 1, "Переместить курсор на пункт Graphics" );
            SendMessage( menuWnd, WM_KEYDOWN, VK_DOWN, 0x1500001 );
            Delay( 2000 );        // задержка 
            PrintString( hwnd, 10, 1, "Щелкнуть левой кнопкой мыши" );
            SendMessage( menuWnd, WM_KEYDOWN, VK_RETURN, 0x1500001 );
            SetTimer( hwnd, 1, 4000, NULL );        // запустить таймер на 4 секунды
            demo = 4;
            return;

        case 4:
            PrintString( hwnd, 10, 1, "Для останова колеса вызывается то же меню" );            
            Delay( 2000 );        // задержка 
            PrintString( hwnd, 10, 1, "Повторный выбор пункта Graphics" );            
            PrintString( hwnd, 10, 2, "Останавливает колесо" );
            SendMessage( menuWnd, WM_KEYDOWN, VK_DOWN, 0x1500001 );
            Delay( 2000 );        // задержка 
            SendMessage( menuWnd, WM_KEYDOWN, VK_RETURN, 0x1500001 );
            PrintString( hwnd, 10, 1, "" );        // очистка области вывода            
            break;

    }
    demo = 0;            // программа обучения завершена
}
//---------------------------------------------------------------------------------------------



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Kuvaldis
Дата 30.7.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



Нашел (подсказали), где "собака зарыта":
Цитата

типичная ошибка. С чего вы взяли что к моменту вызова OnEnterIdle() из другого потока, myMsg созданный на стеке будет еще жив и валиден?

Т.е. если сделать myMsg глобальной переменной, то все работает 

Вопрос закрыт smile


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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