Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
#1

OnTimer и второй поток - C++

11.07.2009, 17:24. Просмотров 1864. Ответов 6
Метки нет (Все метки)

добрый день. у меня возникла следующая проблема.
в обработчике таймера я вывожу время и срабатывает всё это дело каждую секунду.
но в случае если мне нужно создать второй диалог скажем для настройки того же времени то после вызова DoModal для второго диалога програмка виснет.
т.е. я понимаю что не могу продолжить работать с диалог1 пока не закрою диалог2. но перейти к диалог2 не могу т.к. каждую секунду срабатывает таймер и делает активным диалог1.
я так понимаю что для решения этой задачи нужен второй поток. но с потоками я не дружен.
Подскажите пожалуйста варианты решения.
C++
1
2
3
4
5
6
7
8
9
10
void CN2Dlg::OnTimer(UINT nIDEvent) 
{
    CTime t=CTime::GetCurrentTime();
    CString time;
    time=t.Format("%H:%M:%S");
    
    m_time_now.SetWindowText(time);
    
    CDialog::OnTimer(nIDEvent);
}
заранее благодарен)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2009, 17:24     OnTimer и второй поток
Посмотрите здесь:

console win32 ontimer - C++
Здравствуйте, как включить таймер в консольном приложении? Суть задачи: через каждую секунду проверять цвет пикселя... Не понимаю как...

Найти второй самый большой элемент массива и второй самый маленький элемент массива - C++
Помогите пожалуйста: Найти второй самый большой элемент массива и второй самый маленький элемент массива.

поток (stream) - C++
расскажите подробно про работу потока

Поток с GetMessage - C++
Привет всем. У меня в программе в отдельном потоке имеется такой код: while(GetMessage(&msg,0,0,0) { TranslateMessage(&msg); ...

Очистить поток - C++
Хотел с помощью куска кода (см.ниже) очистить буфер связанный с потоком cin. Но выражение в скобках по какой-то причине не изменяется? ...

Не работает поток - C++
Всем доброго времени суток. Ниже представлен код программы, считывающей инф. о пользователе с файла. Проблема: После считывания...

Указатель на поток - C++
void qwe(ifstream *file) { int ch; (*file) >> ch; } int main() { ifstream ifile ("abc.txt"); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
11.07.2009, 18:00     OnTimer и второй поток #2
немного не так.
можешь сделать первый диалог не модальным.
или, в этой функции OnTimer проверяй кто является окном верхнего уровня,
и если верхнее !=this, то вывод времени не делаешь.
и все.
никаких вторых потоков.
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
11.07.2009, 18:08  [ТС]     OnTimer и второй поток #3
Patch, спасибо. эм.. можно функцию для проверки которое из окон является окном верхнего уровня?(я многого не знаю. по-этому, собственно и в разделе Для начинающих )

ну раз уж я так ошибся со вторым потоком, может быть кто-нибудь подскажет как реализовать решение с его помощью? а то тема получилась совсем не по теме (извините за каламбур)
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
12.07.2009, 08:22     OnTimer и второй поток #4
Цитата Сообщение от justanotheruser Посмотреть сообщение
можно функцию для проверки которое из окон является окном верхнего уровня
можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void CN2Dlg::OnTimer(UINT nIDEvent) 
{
if(GetTopWindow() == this->m_hwnd)
{
        CTime t=CTime::GetCurrentTime();
        CString time;
        time=t.Format("%H:%M:%S");
        
        m_time_now.SetWindowText(time);
}        
        CDialog::OnTimer(nIDEvent);
}
Цитата Сообщение от justanotheruser Посмотреть сообщение
ну раз уж я так ошибся со вторым потоком, может быть кто-нибудь подскажет как реализовать решение с его помощью?
задача в принципе неверно поставлена.
фокус в том, что сама идея модальных окон исключает получение сообщений любым окном, кроме модального. за исключением WM_PAINT.
т.е., если ты запускаешь диалог, используя xxx.DoModal(),
ни одно другое окно ничего, кроме собственного перерисовывания делать не сможет(по крайней мере, так официально сказано в MSDN).

кстати, а зачем тебе вообще два модальных диалога?
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
12.07.2009, 12:18  [ТС]     OnTimer и второй поток #5
почитал в MSDN'e. там вроде сказано что GetTopWindow() возвращает указатель на чаилд окна.. т.е. условие
if(GetTopWindow() == (CWnd*)this->m_hwnd)
никогда не выполнится т.к. сам длг1 себе не чаилд. у меня по GetTopWindow() приходит указатель на хендл CTabCtrl'a который лежит на длг1
или я что-то не так понял?
проверил свойства длг1. и он не модальный.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
12.07.2009, 12:50     OnTimer и второй поток #6
1)
GetTopWindow Function

--------------------------------------------------------------------------------

The GetTopWindow function examines the Z order of the child windows associated with the specified parent window and retrieves a handle to the child window at the top of the Z order.

Syntax

HWND GetTopWindow( HWND hWnd
);
Parameters

hWnd
[in] Handle to the parent window whose child windows are to be examined. If this parameter is NULL, the function returns a handle to the window at the top of the Z order.
Return Value

If the function succeeds, the return value is a handle to the child window at the top of the Z order. If the specified window has no child windows, the return value is NULL. To get extended error information, use the GetLastError function.
обратить внимание на эту часть:
C++
1
If this parameter is NULL, the function returns a handle to the window at the top of the Z order.
перевожу: Если параметр = NULL, функция возвращает хэндл окна на самом верху по координате z.
он действительно может давать хэндл CTabCtrl'а, если тот рисовался после окна, в которое ты выводишь свой текст со временем.
это уже более сложный вариант.
у тебя там несколько элементов управления.
самостоятельно строить z-дерево и разбираться кто там чей потомок - дело муторное.
С с MFC можно сделать так:
при создании диалога делаешь
C++
1
CWnd * parent = this->GetParentOwner(); //исходный диалог.
а вместо GetTopWindow проще использовать GetForegroundWindow( )
в void CN2Dlg::OnTimer(UINT nIDEvent)
пишешь:
C++
1
2
CWnd * сparent = GetForegroundWindow( );
if(cparent == parent)...
и дальше по тексту

2)
а что диалог не модальный - я сильно сомневаюсь.
чтобы его сделать нужны приличные познания в работе CDialog, которых у тебя явно нет.
учись.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2009, 12:55     OnTimer и второй поток
Еще ссылки по теме:

STL и поток - C++
Есть вектор, объявленный в основной программе, состоящий из ссылок на компоненты типа TImage и TCheckBox: struct mass { TImage *img; ...

Поток cin - C++
Ребят подскажите почему после того как в цикле для потока cin устанавливается по команде Ctrl+z бит eofbit я не могу юзать поток cin он у...

Поток и принтер - C++
1. Имеет ли дефолтный принтер стандартный поток? Если имеет, то как его зовут? Надо ли его открывать/закрывать? 2. Можно ли к дефольному...

Данные в поток - C++
Ув. профи ,не подскажите ли , Как данные находящиеся в (LPCVOID)pdib и размером dwSize запихнуть в поток, для последующего чтения....

Поток stdin - C++
Доброго времени суток. Ситуация следующая: пытаюсь расширить свои знания в программировании на С++, поэтому начал читать книгу Коплиена...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
14.07.2009, 12:55  [ТС]     OnTimer и второй поток #7
спасибо! получилос!!
Yandex
Объявления
14.07.2009, 12:55     OnTimer и второй поток
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru