![]() |
|
|
![]()
|
|
| Etud |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.11.2007 Репутация: нет Всего: нет |
Приложение на MFC с потоком и таймером.
При нажатии кнопки Button1 создается динамический объект f класса Filter, который используется для получения числа в рабочей фукции потока. int r = f->getRes(); К числу добавляется 1 и результат выводится в Edit Control (m_Edit). f->setRes(); В процессе работы данные объекта f могут изменяться. Для их получения использую таймер. В функции OnTimer() вызываю метод f->getSeek(); и вывожу во второй Edit Control (m_Edit2). Вопросы: 1) Правильно ли объявлен указатель f моего класса Filter(Filter *f;) в исходнике Thread3Dlg.cpp перед рабочей функцией потока. Т.е. он глобальный, а в хэдере Thread3Dlg.h сделать это не получается. #include "Filter.h" Filter *f; 2) Надо ли при работе с таймером для синхронизации применять, например, критические секции. 3) Можно ли один метод класса Filter использовать в одном потоке f->getRes(), а другой в потоке приложения f->getSeek(). P.S. C MFC имею маленький опыт работы. Filter.h
Filter.cpp
В диалоге Thread3Dlg.cpp
Подскажите и покритикуйте плиз. |
||||||
|
|||||||
| Etud |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.11.2007 Репутация: нет Всего: нет |
Хм...И чего так слабо ?
Неужели ни по одному вопросу ? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Код влом читать, много букв. А вопросы говорят о том, что у тебя не только с MFC маленький опыт, но и спотоками вообще, и даже с C++. 1. Глобальные переменные нельзя определять в хедерах, только объявлять (т.е. используя extern), иначе получишь ошибки линковки. 2. С таймером - не надо, а вот для доступа к общим данным - не помешает. 3. Можно, если реализация потоко-безопасна, т.е. методы реентерабельны, а доступ к данным защищен. -------------------- ... |
|||
|
||||
| Etud |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.11.2007 Репутация: нет Всего: нет |
Спасибо за ответик !
Вы не правильно поняли. Это не переменная, а указатель. А дальше пошла рабочая функция потока.
При нажатии кнопки создаем объект, в рабочей функции уже вызываем метод:
А по другому у меня не получается ! Это же не в самом классе приложения MFC, видимости и доступа к нему нет. Добавлено @ 16:45
Несмотря на свой ничтожный опыт и чтения про таймер можно встретить рекомендации и так и этак ! Если работает с общими данными, разве не надо делать синхронизацию данных ??? Надо ведь. Это сообщение отредактировал(а) Etud - 30.8.2010, 16:46 |
||||||||
|
|||||||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Потрясающе. А указатель, по-твоему, не переменная? Надо, но таймер здесь совершенно не причем. Если просто таймер, без обращения из разных потоков к общим данным - не надо. Если есть обращение к общим данным, неважно как организованное, практически всегда надо. "Практически", т.к. если только чтение, то тоже не надо. Ну и т.д. Почитал бы Рихтера, что ли.
Да причем здесь MFC? Если есть где-то какой-то объект, то для доступа к нему нужен указатель (ссылка), по другому не бывает. Глобальные переменные - самый худший вариант обеспечения общего доступа к объекту. Как вариант, рассмотри возможность передачи указателя на объект в функцию потока. А то привыкнешь к глобальным переменным, а неправильные привычки потом мешать будут. -------------------- ... |
||||
|
|||||
| Etud |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.11.2007 Репутация: нет Всего: нет |
Да-да ! Ошибся, каюсь. Конечно можно, но позже. Форум тогда зачем. Эээ, поток то с GUI увязан.
Снова согласен. Это просто пример был. Это мне понятно. Сделаю новый вариант - напишу ! |
|||
|
||||
| Etud |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.11.2007 Репутация: нет Всего: нет |
Переработанная версия с передачей объекта f в качестве параметра в функцию
для создания потока. Итак: 1) В заголовке класса Dlg.h объявили переменную-указатель f Filter *f; 2) В обработчике кнопки создаем объект f, в методах устанавливаем идентификатор окна и адрес текущего объекта, создаем поток с рабочей функцией и объектом-параметром
3) Рабочая функция потока
Это сообщение отредактировал(а) Etud - 31.8.2010, 18:38 |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |