Вопрос № 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, и я вышлю Вам свою прогу.
Ответ отправил: 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 вариантов - это просто чих для компьютера.
Честное слово, я бы написал прогу, но непедагогично это...
Отвечает: 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