char *b;
AnsiString a = "|||";
//определение скорости выполнения участка 1
int deltaTime = timeGetTime();
for(int u= 0;u<15000;u++)
{
b = a.c_str();
}
deltaTime = timeGetTime()-deltaTime;
Edit2->Text = (AnsiString)deltaTime;
//предполагаемый WaitForMultipleobjects, хотя стоит проверить
Sleep(1);
//определение скорости выполнения участка 2
deltaTime = timeGetTime();
for(int u= 0;u<15000;u++)
{
b = a.c_str();
}
deltaTime = timeGetTime()-deltaTime;
Edit3->Text = (AnsiString)deltaTime;
WaitForSingleObject внутри
...и еще любопытно: как выглядит зависимость быстродействия программы от количества задействованных в ней event'ов?
функция WaitForSingleObject переводит статус потока, который её вызвал, в статус "ожидание", заполняет какое-то поле, в котором хранится хендл, котолрый он ожидает. Когда происходит изменение состояния объекта ожидания, заодно ищутся все ожидающие потоки, которые ждут этот объект и их состояние переводится в состояние "готов" (или как оно там называется). А планировщик потоков дальше сам разберётся. Да, про таймауты забыл. При каждом "тике" таймера, проверяются все ожидающие потоки, у которых указан таймаут (не INFINITY), если у кого-то время истекло, то его состояние переводится в "готов".
P.S. если я не ошибаюсь функция WaitForSingleObject, это оболочка вокруг функции WaitForMultipleObjects
Код:
Так вот - участок с номером 1 по результатам будет выполнятся медленнее чем участок с номером 2. Мои мысли такие, что виндосв после продолжения потока (после паузы) временно даёт ему больший приоритет. Посути при использовании ивентов возможно достич еще большей скорости, чем использовать другую реализацию программы.
Если я ошибаюсь поправте, мне самому интересно, определённо кто-то знает подробно.
этой книге всё подробно описано
да, планировщик в некоторых случаях временно повышает приоритет потоков вышедших из ожидания. В
Функция Sleep безусловно заканчивает текущий временной отрезок, выданный потоку. Вызов Sleep( 0 ) фактически заставляет поток "пропустить" очередь к процессору, но только один цикл.
Возможно, получается так, что первый цикл разрывается между двумя слайсами, а после вызова Sleep( 1 ) поток автоматически попадает в самое начало нового и цикл успевает выполниться целиком до переключения на другой поток.