Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

11.07.2009, 17:24. Просмотров 1929. Ответов 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);
}
заранее благодарен)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2009, 17:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос OnTimer и второй поток (C++):

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

Скопировать поток и добавить ошибки в поток - C++
Здорова господа! Есть задачка: "Скопируйте поток объектов типа Name_and_address и вставьте в него столько ошибок, сколько сколько...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. - C++
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

Скопировать поток в поток - C++
Есть ли возможность скопировать один поток в другой. Например int main() { ofstream (*P) = new ofstream; ofstream...

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

SetTimer и OnTimer: зачем вызывают метод OnTimer из базового класса? - Visual C++
Читаю МСДН по SetTimer здесь http://msdn.microsoft.com/en-us/library/49313fdf.aspx. Зачем в методе OnTimer вызывают тот же метод из...

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

ну раз уж я так ошибся со вторым потоком, может быть кто-нибудь подскажет как реализовать решение с его помощью? а то тема получилась совсем не по теме (извините за каламбур)
0
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
12.07.2009, 08:22 #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).

кстати, а зачем тебе вообще два модальных диалога?
0
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
12.07.2009, 12:18  [ТС] #5
почитал в MSDN'e. там вроде сказано что GetTopWindow() возвращает указатель на чаилд окна.. т.е. условие
if(GetTopWindow() == (CWnd*)this->m_hwnd)
никогда не выполнится т.к. сам длг1 себе не чаилд. у меня по GetTopWindow() приходит указатель на хендл CTabCtrl'a который лежит на длг1
или я что-то не так понял?
проверил свойства длг1. и он не модальный.
0
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
12.07.2009, 12:50 #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, которых у тебя явно нет.
учись.
0
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
14.07.2009, 12:55  [ТС] #7
спасибо! получилос!!
0
14.07.2009, 12:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2009, 12:55
Привет! Вот еще темы с ответами:

Не запускается второй поток - Java
Задача: первый поток генерирует в буфер 100 чисел, в интервале от 1 до 16; второй поток извлекает максимальное значение из буфера и...

Не запускается второй поток - C#
Не понимаю, но такое ощущение, что второй поток не запускается(MessageBox не выводится). Первый поток(th_listen) запускается и работает, а...

Не могу создать второй поток. Где ошибка? - C++ WinAPI
Всем доброг овремени суток. Знаю что "потасканная" тема. Но совсем сбился с толку. Помогите найти ошибку. Вроде все по книге делаю а...

Второй поток для длинных операций на форме - C#
Привет! Помню, где-то читал, что в .Net нельзя менять элементы управления формы в потоке, в котором они не создавались. Скажите, как...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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