Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2007, 11:45   #11
Alek86
Форумчанин
 
Регистрация: 25.09.2007
Сообщений: 189
По умолчанию

merax, твой вариант, скорее всего, загрузит проц не по детски.

ACE Valery, почитай Рихтера, но я думаю, что там должна пользоваться функция WaitForSingleObject

Последний раз редактировалось Alek86; 02.12.2007 в 11:49.
Alek86 вне форума Ответить с цитированием
Старый 02.12.2007, 11:58   #12
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Цитата:
Синхронизация с использованием объектов ядра

В Windows для синхронизации используются самые разные объекты, применение которых существенно различается. Однако при рассмотрении синхронизации особое положение имеет момент перехода ожидаемого объекта в свободное состояние - с точки зрения ожидающего потока совершенно неважно, какие события привели к этому и какой именно объект стал свободным. Поэтому при большом разнообразии объектов, пригодных для синхронизации, существует всего несколько основных функций, осуществляющих ожидание объекта ядра:
DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMsecs );
DWORD WaitForMultipleObjects(
DWORD nCount, const HANDLE* lpHandles,
BOOL bWaitAll, DWORD dwMsecs
);

С точки зрения операционной системы объекты ядра, поддерживающие интерфейс синхронизируемых объектов, могут находиться в одном из двух состояний: свободном (signaled) и занятом (nonsignaled). Функции проверяют состояние ожидаемого объекта или ожидаемых объектов и продолжают выполнение, только если объекты свободны. В зависимости от типа ожидаемого объекта, система может предпринять специальные действия (например, как только поток дожидается освобождения объекта исключительного владения, он сразу должен захватить его).

Функция WaitForSingleObject осуществляет ожидание одного объекта, а функция WaitForMultipleObjects может ожидать как освобождения любого из указанных объектов (bWaitAll = FALSE), так и всех сразу (bWaitAll = TRUE). Ожидание завершается либо по освобождении объекта(ов), либо по истечении указанного интервала времени (dwMsecs) в миллисекундах (бесконечное при dwMsecs = INFINITE). Код возврата функции позволяет определить причину - таймаут, освобождение конкретного объекта либо ошибка.

Если функция WaitForMultipleObjects (или ее клон) ожидает сразу все объекты группы, то до освобождения всех ожидаемых объектов одновременно никаких мер по занятию ранее освободившихся объектов функция не предпринимает.

В тех случаях, когда поток переходит в состояние ожидания, его исполнение блокируется до конца ожидания. Для реализации APC (и функций завершения ввода-вывода) необходимо было предусмотреть в операционной системе возможность приостановки потока с вызовом асинхронных процедур. Это связано с тем, что система должна гарантировать выполнение функций в контексте конкретного потока для соблюдения норм безопасности. Ожидание оповещения - это такое состояние ожидания, которое может быть завершено либо по достижении таймаута, либо при освобождении указанного объекта, либо после обработки APC. При этом в контексте потока, находящегося в состоянии ожидания оповещения, обрабатывается APC вызов и только затем завершается состояние ожидания.

Для перехода в ожидание оповещения предусмотрены функции SleepEx, WaitForMultipleObjectsEx, WaitForSingleObjectEx и SignalObjectAndWait.

To Alex86...

А вот теперь прочти и подумай, что сильнеебудет вешать проц, а ?
merax вне форума Ответить с цитированием
Старый 02.12.2007, 14:38   #13
Alek86
Форумчанин
 
Регистрация: 25.09.2007
Сообщений: 189
По умолчанию

что-то не нашел я про вешание проца ничего
но взамен могу кинуть цитаты из Рихтера
не точно про предмет дискуссии, но рядом

Цитата:
Избегайте спин-блокировки на однопроцессорных машинах. "Крутясь" в цикле, поток впустую транжирит драгоценное процессорное время, не давая другому потоку изменить значение переменной. Применение функции Sleep в цикле while несколько улучшает ситуацию. С ее помощью Вы можете отправлять свой поток в сон на некий случайный отрезок времени и после каждой безуспешной попытки обратиться к ресурсу увеличивать этот отрезок. Тогда потоки не будут зря отнимать процессорное время.
Цитата:
Следующий вызов сообщает системе, что поток будет ждать до тех пор, пока не завершится процесс, идентифицируемый описателем hProcess.

WaitForSingleObject(hProcess, INFINITE);

В данном случае константа INFINITE, передаваемая во втором параметре, подска зывает системе, что вызывающий поток готов ждать этого события хоть целую веч ность. Именно эта коистанта обычно и передается функции WaitForSingleObject, но Вы можете указать любое значение в миллисекундах. Кстати, константа INFINITE опре делена как 0xFFFFFFFF (или -1). Разумеется, передача INFINlTE не всегда безопасна Если объект так и не перейдет в свободное состояние, вызывающий поток никогда не проснется; одно утешение, тратить драгоценное процессорное время он при этом не будет
Alek86 вне форума Ответить с цитированием
Старый 02.12.2007, 17:15   #14
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Что то конечно в этом есть, но
1) Если поток просто ждет, то это не означает, что процессорное время не расходуется, ведь он все равно находиться в бесконечном цикле синхронизируясь для вычисления времени оставшегося до завершения.
2) Может пора отойти от времени? Нам нужно завершение по конкретному событию, а именно клику мышки.
merax вне форума Ответить с цитированием
Старый 02.12.2007, 22:45   #15
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
1) Если поток просто ждет, то это не означает, что процессорное время не расходуется, ведь он все равно находиться в бесконечном цикле синхронизируясь для вычисления времени оставшегося до завершения.
Если поток не в состоянии выполнения, то никакого времени он точно не отнимает, читаем про планировщик. И никакого цикла там нет.
still_alive вне форума Ответить с цитированием
Старый 02.12.2007, 23:52   #16
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Ребята, придержите коней. Даже если я и понимаю, о чем вы пишите, есть одно но: скажем так, я изучила циклы, массивы, структуры и с помощью этого мне надо написать прогу. Маленькую, простенькую прогу. Без всяких оптимизаций загрузки проца и прочих прелестнейших заманушек.
Просто есть бесконечный цикл. И в теле этого цикла нужно приостановить выполнение программы до нажатия кнопки мышки. Нажатием мышки руководит пользователь. Поэтому нельзя останавливать цикл на заданный промежуток времени. Просто я думала, что есть в С++ какая-нибудь стандартная функция (по типу getchar() или getch() для клавиш), о которой я не знаю.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 04.12.2007, 17:36   #17
Alek86
Форумчанин
 
Регистрация: 25.09.2007
Сообщений: 189
По умолчанию

думаю, такого в виндоус нет
нужно именно ждать сообщения про нажатие на клавишу
так что попробуй, наверное, вариант merax вот так:

Код:
   cout << "Hello!!!" << endl;  
   cout << "Mouse Click";  
   do  
   {  
     Sleep(0);  // это для не 100% загрузки проца (читай цитату Рихтера)  
   {  
   while (!SgIsKeyPressed(VK_LBUTTON))  
   cout << endl;
Alek86 вне форума Ответить с цитированием
Старый 05.12.2007, 00:20   #18
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Н-да... Оптимизация налицо. Кино на дополнительном мониторе тормозит гораздо меньше.
Но я все равно не уверена, что 100% обработается клик мышки. Хотя вероятность провала мала... Что ж, всем огромное спасибо. Оставлю пока так.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 05.12.2007, 06:43   #19
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Цитата:
Сообщение от Alek86 Посмотреть сообщение
думаю, такого в виндоус нет
нужно именно ждать сообщения про нажатие на клавишу
так что попробуй, наверное, вариант merax вот так:

Код:
   cout << "Hello!!!" << endl;  
   cout << "Mouse Click";  
   do  
   {  
     Sleep(0);  // это для не 100% загрузки проца (читай цитату Рихтера)  
   {  
   while (!SgIsKeyPressed(VK_LBUTTON))  
   cout << endl;
Мне вот интересно, что это ты по моему пути пошел??? Что не используешь "WaitForSingleObject" я бы очень хотел на код посмотреть. И половинная информация (тот код что ты в инете нароешь) меня не устроит. Нужна самописная рабочая функция с остановкой потока и обработкой клика мауса. А так пустозвонство это.
merax вне форума Ответить с цитированием
Старый 05.12.2007, 10:35   #20
Alek86
Форумчанин
 
Регистрация: 25.09.2007
Сообщений: 189
По умолчанию

почему я это написал? из-за поста
Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Ребята, придержите коней. Даже если я и понимаю, о чем вы пишите, есть одно но: скажем так, я изучила циклы, массивы, структуры и с помощью этого мне надо написать прогу. Маленькую, простенькую прогу. Без всяких оптимизаций загрузки проца и прочих прелестнейших заманушек.
Просто есть бесконечный цикл. И в теле этого цикла нужно приостановить выполнение программы до нажатия кнопки мышки. Нажатием мышки руководит пользователь. Поэтому нельзя останавливать цикл на заданный промежуток времени. Просто я думала, что есть в С++ какая-нибудь стандартная функция (по типу getchar() или getch() для клавиш), о которой я не знаю.
больше ведь ничего не надо. мне винапи не интересно, и лазить вспоминать сообщения виндовс, которые мне никогда не нравились, не хочу
Alek86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
приостановка выполнения процедуры BESS Общие вопросы Delphi 5 15.09.2008 00:53
Приостановка цикла для выполнения внешней программы Uomo Общие вопросы Delphi 3 04.04.2008 11:48
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10
Как замерить время выполнения программы Gracel Общие вопросы Delphi 5 12.06.2007 22:16
Приостановка программы Hintman Общие вопросы Delphi 6 14.04.2007 23:38