Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 537
от 28.09.2006, 21:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 386, Экспертов: 47
В номере:Вопросов: 4, Ответов: 12


Вопрос № 56440: Всем привет. Задча: есть прибор, нужно чтобы он олайн что называется сгимал показания и выводин на экране данные, так вот я сделал след. образом, у меня два потока, один для снятия данных, другой для прорисовки окна итд итп. Взаимодействия между ...
Вопрос № 56451: Здравствуйте, уважаемые Эксперты! Помогите, пожалуйста, написать программу, которая опрашивает дату в формате DD MM YYYY, которая определяет, сколько дней осталось до конца года. Заранее БЛАГОДАРЕН. ...
Вопрос № 56463: Пожалуйста, помогите! Как определить, сколько существует четырехзначных чисел, кратных 45, средние цифры которых 7 и 9. Напечатать числа и количества. .
Вопрос № 56464: Пожалуйста, помогите! Мне нужно написать функцию, которая переносит все нулевые элементы в конец массива, а все последние в начало со сбережением порядка расположения....

Вопрос № 56.440
Всем привет.
Задча: есть прибор, нужно чтобы он олайн что называется сгимал показания и выводин на экране данные, так вот я сделал след. образом, у меня два потока, один для снятия данных, другой для прорисовки окна итд итп. Взаимодействия между ними практически никакого, одно заполяет массив, второе считывает и рисует график (синхронизации нет). Так вот так получается что данные отображаются только первые несколько секунд, а потом они не обновляются и нужно например изменить его размер, чтобы оно перерисовалось с новыми данными.
Возможно несколько наивный вопрос, но как заставить перерисоваться окно из другого потока? А правильно ли изначально задумал работать с двумя потоками и шарить между ними данные?
Отправлен: 23.09.2006, 15:37
Вопрос задал: Shtasik (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: n0name
Здравствуйте, Shtasik!
Как мне кажется так и будет оптимально.
Чтобы перерисовать окно используйте такую функцию:
void RefreshWnd(HWND hwnd){
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
Ответ отправил: n0name (статус: 6-ой класс)
Ответ отправлен: 23.09.2006, 15:54

Отвечает: Хватов Сергей
Здравствуйте, Shtasik!

Идея совершенно правильная. Только надо исключать одновременный доступ к общим данным. Механизм блокировки называется семафорами. А так как вы не уточнили, какую платформу вы используете, сказать точнее как это реализовать не могу.
Ответ отправил: Хватов Сергей (статус: 5-ый класс)
Ответ отправлен: 23.09.2006, 16:37
Оценка за ответ: 4

Отвечает: Delph
Здравствуйте, Shtasik!

Попробуйте прорисовку результирующего окна подвесить на таймер. Я аналогичным образом выкрутился, когда нужно было написать нечто похожее на арканоид. Если Вы используете C# или сможете адаптировать мой код под свою среду, сообщите мне свой E-mail, и я вышлю Вам свою прогу.

Моя почта: greatdelph@gmail.com; ICQ: 315-100-307.

Павел
Ответ отправил: Delph (статус: 1-ый класс)
Ответ отправлен: 25.09.2006, 09:16

Отвечает: AlexKlaip
Здравствуйте, Shtasik!
Работа с двумя потоками в данном случае совершенно оправдана (я бы
добавил только синхронизацию).
Предлагаю при создании потока снятия данных передать в него указатель на Ваше
окно. В потоке, после каждого снятия всех данных, посылайте Вашему окну какое-либо свое сообщение, например определите его так:
#define WM_ENDDATA WM_USER+100

А в обработчике этого сообщения в классе окна, можно делать, что угодно:
- перерисовывать прямо там взяв CClientDC dc(this); или CDC *pDC = GetDC();
- послать PostMessage(WM_PAINT, 0, 0).

Удачи!
Ответ отправил: AlexKlaip (статус: 2-ой класс)
Ответ отправлен: 25.09.2006, 10:30

Отвечает: Sergey A. Wedensky
Здравствуйте, Shtasik!
Перерисовать окно из другого потока можно функциями InvalidateRect(), RedrawWindow() и т.д. либо послав ему соответствующее сообщение. Надо, конечно, чтобы окно себя отрисовывало по WM_PAINT, а не там в потоке каком-нибудь GetDC()/.../ReleaseDC().
Работать с потоками - это правильно. Но синхронизация все-же нужна. Вы же обращаетесь к одной и той же области памяти. Посмотрите InitializeCriticalSection()/EnterCriticalSection()/LeaveCriticalSection()/DeleteCriticalSection(), например. Поверьте, ничего сложного :)
Ответ отправил: Sergey A. Wedensky (статус: 2-ой класс)
Ответ отправлен: 25.09.2006, 10:39
Оценка за ответ: 4


Вопрос № 56.451
Здравствуйте, уважаемые Эксперты! Помогите, пожалуйста, написать программу, которая опрашивает дату в формате DD MM YYYY, которая определяет, сколько дней осталось до конца года.
Заранее БЛАГОДАРЕН.
Отправлен: 23.09.2006, 17:24
Вопрос задал: Petrov (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Uman
Здравствуйте, Petrov!
Существует функция DayOfTheYear() в качестве параметра принимающая TDateTime переменную, и возврщает количество дней прошедших с начала года...

Приложение:

Ответ отправил: Uman (статус: 2-ой класс)
Ответ отправлен: 23.09.2006, 20:03

Отвечает: Delph
Здравствуйте, Petrov!

Предлагаю Вам программулину, которую опробовал на Borland C++ 3.1. Если у Вас другая версия среды программирования, надеюсь, Вы сможете адаптировать мой код.

В программе предполагается, что указанный день следует учитывать при подсчёте оставшихся (т.е. если ввести 31 декабря, то до конца года остаётся ещё 1 день). Если Вам это не нужно, то в строке "int sum = Month[m-1] - d + 1;" следует удалить "+ 1".

Приложение:

Ответ отправил: Delph (статус: 1-ый класс)
Ответ отправлен: 25.09.2006, 10:31

Отвечает: Sergey A. Wedensky
Здравствуйте, Petrov!
Простейший вариант программы в приложении.

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: 2-ой класс)
Ответ отправлен: 25.09.2006, 10:34


Вопрос № 56.463

Пожалуйста, помогите! Как определить, сколько существует четырехзначных чисел, кратных 45, средние цифры которых 7 и 9. Напечатать числа и количества.
Отправлен: 23.09.2006, 19:24
Вопрос задал: Tkachuk (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Татьяна
Здравствуйте, Tkachuk!
Для того чтобы число делилось на 45, необходимо чтобы оно делилось на 5 и на 9.
Признак делимости на 5 - это "0" или "5" на месте последней цифры
Признак делимости на 9 - сумма цифр должна делиться на 9
Так как средние цифры 7 и 9, то число имеет вид "х790","х970" или "х795","х975"
Первый вариант 7 + 9 + 0 = 16, ближайшее делимое на 9 будет 18, т.е. первая цифра 2 - числа 2790 и 2970
Второй вариант: 7+9+5 = 21, чтобы делилось на 9, ближайшая сумма 27, т.е. первая цифра 6 - числа 6795 и 6975
Т.е. получили всего 4 числа, удовлетворяющего данным условиям.
Немного смущает, что вопрос в рассылке по С, но если вам надо алгоритм я думаю, стоит идти по этому же пути. Если это составит сложность для вас пишите.
---------
Возможно все. И ничего возможно тоже.
Ответ отправила: Татьяна (статус: Практикант)
Ответ отправлен: 23.09.2006, 20:05

Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Здравствуйте, Tkachuk!
Вы же на компьютере считаете.
Так что просто переберите все числа, кратные 45, и посчитайте, у скольких из них средние цифры равны 7 и 9. В чём именно проблема?

Перебор 9000/45 вариантов - это просто чих для компьютера.
Честное слово, я бы написал прогу, но непедагогично это...
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 2-ой класс)
Ответ отправлен: 24.09.2006, 16:33

Отвечает: Sergey A. Wedensky
Здравствуйте, Tkachuk!
Ну, не знаю что имелось ввиду... Но вообще учитывая количество четырехзначных чисел задача легко решается перебором. См. приложение.

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: 2-ой класс)
Ответ отправлен: 25.09.2006, 10:41


Вопрос № 56.464
Пожалуйста, помогите! Мне нужно написать функцию, которая переносит все нулевые элементы в конец массива, а все последние в начало со сбережением порядка расположения.
Отправлен: 23.09.2006, 19:30
Вопрос задал: Tkachuk (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ADSota
Здравствуйте, Tkachuk!

см. один из вариантов в примере

Приложение:

---------
Открыть глаза навстречу солнцу

Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 25.09.2006, 09:10


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное