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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 8743
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 3219
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2596
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1709
Дата выхода:17.12.2011, 19:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:277 / 163
Вопросов / ответов:2 / 2

Консультация # 184726: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: надо реализовать простой вариант метода ветвей и границ для задачи коммивояжёра. Требования к программе: - в списке хранить под-задания - точнее указатели на них и упорядочивать эти подзадачи по значению границы - каждый раз выбирать из списка "самую потенциально лучшую" подз...


Консультация # 184731: Здравствуйте! У меня возникли сложности с таким вопросом: Необходимо Разработать программу, которая создает в отдельном потоке случайный массив А из N целых чисел в диапазоне от -999 до 999 выводит на экран эти числа. Создание и вывод элементов массива производится через заданное время T, N и T вводятся пользователем до запуска процесса. Массив...

Консультация # 184726:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
надо реализовать простой вариант метода ветвей и границ для задачи коммивояжёра. Требования к программе:
- в списке хранить под-задания - точнее указатели на них и упорядочивать эти подзадачи по значению границы
- каждый раз выбирать из списка "самую потенциально лучшую" подзадачу - и делить её ровно на две
- при этом разделяющий элемент выбирать по какому либо самому простому (и быстрому) но жадному" алгоритму
- в "правой" задаче он войдёт в СПИСОК таких ВЫБРАННЫХ элементов (добавится к уже имеющемуся такому списку у задачи-родителя), а в "левой" - добавится к списку табулированных элементов
- генерация входов - это так называемая геометрическая ЗКВ( где точки равномерно разбрасываются в N-мерный куб ([0,1])^N(интересны значения N от 3 до скажем 11))
- подсчитать "количественные характеристики выполнения программы";


Дата отправки: 10.12.2011, 09:59
Вопрос задал: Yulesik (2-й класс)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Киселёва Алёна aka Verena (Профессор):

Здравствуйте, Yulesik!
Вот, перевела из этого алгорима. Если будут вопросы, пишите.
Результат проверила, с паскалевской программой совпадает.
Компилировалось под MS VS 2010.
Удачи!

Приложение:

Консультировал: Киселёва Алёна aka Verena (Профессор)
Дата отправки: 16.12.2011, 15:09
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 184731:

Здравствуйте! У меня возникли сложности с таким вопросом:
Необходимо Разработать программу, которая создает в отдельном потоке случайный массив А из N целых чисел в диапазоне от -999 до 999 выводит на экран эти числа. Создание и вывод элементов массива производится через заданное время T, N и T вводятся пользователем до запуска процесса. Массив обрабатывается двумя другими потоками В и С, работающими параллельно с потоком, создающим массив. Все потоки выводят результаты своей работы в текстовые окна, каждый поток в свое окно.
А)Определение длины пространственной ломаной линии, соединяющей точки, координаты которых заданы каждой тройкой чисел
Б)Вычисление отклонений всех чисел от округленного среднего арифметического

Можете назначить свою цену если в этом есть необходимость. smile

Дата отправки: 10.12.2011, 20:28
Вопрос задал: MishaSurgut (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Киселёва Алёна aka Verena (Профессор):

Здравствуйте, MishaSurgut!
Вот пример такой программы. Правда, тут всё выводится в одну

консоль, чтобы выводить в разные окна надо делать оконное приложение и в каждом потоке

вместо cout выводить на какой-нибудь свой контрол.
В программе создаётся по три потока на

каждой итерации, каждый выполняет свою задачу. Один заполняет массив, другой считает длину

линии, третий ищет отклонения. Для синхронизации потоков используются события (event) -

одно для потока создания и одно для потоков обработки.
Используемые WinAPI функции:


CreateEvent

Эта функция создаёт или открывает существующее событие, возвращаемым

значением является его описатель.

Код :
HANDLE CreateEvent(
    LPSECURITY_ATTRIBUTES 

lpEventAttributes, //Аттрибуты защиты
    BOOL bManualReset, //Ручной сброс
    BOOL 

bInitialState, //Состояние при создании
    LPCTSTR lpName //Имя (если необходимо)
 );

Параметры функции:
lpEventAttributes - в качестве этого параметра передаётся адрес

структуры вида:
Код :
typedef struct _SECURITY_ATTRIBUTES {
    DWORD nLength; //Размер 

структуры (как правило, берётся sizeof)
    LPVOID lpSecurityDescriptor; //Указатель на 

дескриптор, контролирующий совместное                                        

//использование объекта
   BOOL bInheritHandle; //Флаг, разрешающий наследование объекта 

дочерним процессом
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES; 

bManualReset - если

этот параметр true, то помещение объекта в несигнальное состояние нужно производить вручную

(путём вызова спецмальной функции). Если же передать сюда false, то событие будет обладать

автосбросом, т.е. автоматически возвращаться в несигнальное состояние.
bInitialState - если

этот параметр равен true, начальное состояние события - сигнальное, в противном случае -

несигнальное.
Более подробную информацию можно получить в

MSDN.


WaitForSingleObject

Эта функция приостанавливает выполнение текущего потока до тех пор,

пока указанный в её параметрах объект ядра не придёт в сигнальное состояние (также возможен

выход по таймауту). Применяется для ограниничения доступа к разделяемым ресурсам.

Параметром чаще всего служит событие, семафор или мьютекс, н о также в качестве параметра

может выступать уведомление (notification), процесс, поток и некоторые другие объекты.

Возвращаемое значение показывает, что послужило выходом из функции. Это может быть

WAIT_ABANDONED (специфическое значение, возвращаемое в случае завершения потока, владеющего

мьютексом), WAIT_OBJECT_0 (объект получил сигнальное состояние - в этом случае функция сама

переводит его в несигнальное, а для семафора наращивает счётчик числа занятых ресурсов),

WAIT_TIMEOUT (функция вышла по таймауту).
Код :
DWORD WaitForSingleObject(
    HANDLE 

hHandle, //Описатель объекта ядра, сигнальное состояние которого нас интересует 
   DWORD 

dwMilliseconds //Таймаут, по истечению которого прервать ожидание 
);
Рассмотрим

подробнее некоторые параметры функции:
dwMilliseconds - здесь можно указать любой

необходимый таймаут, кроме того, если указать 0, функция вернёт потоку управление сразу

(таким образом можно проверить состояние объекта), а если указать константу INFINITE,

функция не будет учитывать время и будет ждать только сигнального состояния объекта ядра.
Более подробную информацию можно получить в MSDN.
CreateThread
Эта функция создаёт поток

внутри адресного пространства текущего процесса. Возвращает описатель созданного потока.

Функция полезна, когда, например, нужно выполнять какие-то действия в оконном приложении,

но не отключать при этом его интерфейс. В общем случае поток начинает работу сразу после

вызова этой функции, и все действия, которые он выполняет, не меша ют работе программы.
Код :
HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes, //Аттрибуты защиты 
 

  SIZE_T dwStackSize, //Размер стека потока (если указать 0, то берётся по умолчанию) 
   

LPTHREAD_START_ROUTINE lpStartAddress, //Адрес стартовой функции 
   LPVOID lpParameter, 

//Параметр для передачи потоку 
   DWORD dwCreationFlags, //Служебные флаги 
   LPDWORD 

lpThreadId //ID потока 
); 

Рассмотрим подробнее некоторые параметры функции:
lpStartAddress - указатель на стартовую функцию потока (т.е. её название), которую надо

объявить внутри приложения. Она должна иметь определённый вид:
Код :
DWORD WINAPI 

ThreadProc( //Имя функции может быть произвольным 
   LPVOID lpParameter
 ); 

lpParameter - параметр, передаваемый в стартовую функцию потока. Если потоку необходимо

передать несколько параметров, следует либо использовать глобальные переменные, либо

объявлять структуру со всеми необходимыми данными и передавать её.
dwCreationFlags - в

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

сразу после создания или по вызову функции ResumeThread (в первом случае в параметре можно

передать 0, во втором - флаг CREATE_SUSPENDED).
lpThreadId - возвращаемый параметр - id

потока, который иногда может быть полезен (например, если потоку будет посылаться

сообщение). Если id не нужен, можно передать NULL.
Более подробную информацию можно получить

в MSDN.
CloseHandle

, собственно, делает именно то, как называется: закрывает и спользуемый дескриптор.
Код в

приложении, проверено на MS VS 2010.
Будут вопросы, обращайтесь.
Удачи!

Приложение:

Консультировал: Киселёва Алёна aka Verena (Профессор)
Дата отправки: 16.12.2011, 13:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное