На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Усыпить поток на 50 микросекунд. , Надо усыпить поток на время меньшее 100 микросекунд.
    Надо усыпить поток на время меньшее 100 микросекунд. Sleep позволяет усыпить на время не меньшее 1 милисекунде. Надо меньше 100 микросекунд. Может есть какие либо самописные функции?
      Усыпить нельзя, да и смысла это не имеет никакого - если поток потерял управление, оно к нему вернётся не скоро.

      Можно подождать нужного значения QueryPerformanceCounter или др. функции
      Сообщение отредактировано: MBo -
        Цитата MBo @
        Усыпить нельзя, да и смысла это не имеет никакого - если поток потерял управление, оно к нему верётся не скоро.

        Можно подождать нужного значения QueryPerformanceCounter или др. функции

        Я сейчас так и делаю. А эта функция тоже переключает поток?
          Нет
            Цитата a_n_y_a @
            Надо усыпить поток на время меньшее 100 микросекунд

            Попробуй через NtDelayExecution. Она берёт задержку в 100 наносекундных интервалах. Скажем, усыпить на 80 микросекунд:
            ExpandedWrap disabled
              function NtDelayExecution(Alertable:boolean;Interval:PLARGE_INTEGER):NTSTATUS; stdcall; external 'ntdll.dll';
              ...
              var
               st:NTSTATUS;
               p:LARGE_INTEGER;
              begin
               p.QuadPart:=-80*10; // относительное время
               st:=NtDelayExecution(false,@p);
              end;
              Цитата Krid @
              Попробуй через NtDelayExecution. Она берёт задержку в 100 наносекундных интервалах.

              Бесполезно, т.к. в винде отсчет времени всех функций ожидания осуществляется по системному таймеру, который имеет разрешение по умолчанию 10-15 мс и минимум 1 мс (можно установить путем вызова ф-ии timeBeginPeriod).

              PS. Начиная с Win 8 для более точного отсчета времени функций ожидания используется счетчик высокого разрешения а ля QueryPerformanceCounter, но его вызов по любому происходит только при запуске планировщика потоков, т.е. либо по тому же сис.таймеру, либо в случайные моменты времени переключения с одного потока на другой. См. Timer Accuracy:
              Цитата
              The timer can still expire up to a system clock period later than the specified time, and might expire even later if processing of the system clock interrupt is delayed by interrupt processing for other devices.
              Сообщение отредактировано: leo -
                Цитата leo @
                Начиная с Win 8
                Почему Win 8 ? Он ещё в 2000 был...

                Цитата leo @
                но его вызов по любому происходит только при запуске планировщика потоков, т.е. либо по тому же сис.таймеру, либо в случайные моменты времени переключения с одного потока на другой
                Это простая функция, которая не делает никаких переключений в ядро. Она тупо использует rdtsc (при его наличии), только его результат делится на 1024 (не знаю на всех ли системах именно 1024, но у меня на 7-ке точно).
                Так что всё ок. Единственное, конечно, с его помощью "заснуть" не получится, цикл будет грузить проц по полной:
                ExpandedWrap disabled
                  procedure TForm1.Button1Click(Sender: TObject);
                  var F, N1, N2: Int64;
                  begin
                    QueryPerformanceFrequency(F);
                    QueryPerformanceCounter(N1);
                    repeat
                      QueryPerformanceCounter(N2)
                    until (N2-N1)/F > 50/1000000;
                    MessageBox(0, PChar(IntToStr(N2-N1)+' / '+IntToStr(F)+ ' = '+FloatToStr((N2-N1)/F*1000000)+' mcs'), '', MB_OK or MB_ICONINFORMATION or MB_TASKMODAL or MB_SETFOREGROUND)
                  end;
                  Цитата Jin X @
                  Почему Win 8 ? Он ещё в 2000 был...

                  Речь не о PerformanceCounter-е как таковом, а о его использовании в системных функциях задержки и ожидания типа KeDelayExecutionThread и т.п. - cм. Timer Accuracy, предпоследний абзац.
                  Сообщение отредактировано: leo -
                    Сакральный вопрос: а зачем?
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0298 ]   [ 17 queries used ]   [ Generated: 29.03.24, 15:16 GMT ]