C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Почему у меня цикл тормозит без среды (BDS2006)?!!
DENIS452
Отправлено: 30.10.2006, 23:22


Ученик-кочегар

Группа: Участник
Сообщений: 3



Почему у меня цикл тормозит без среды (BDS2006)?!!!

Почему у меня этот цикл работает нормально тока при запущеной
среде (BDS2006) а без неё раза в 3 медленее?!!!

Тоесть, запускаю прогу она начинает кидать UDP пакеты
с определённой скоростью, ниже ожидаемой,просто запускаю среду-
скорость повышается до нормальной закрываю BDS2006 опять падает
раза в три!!!

Какие есть идеи?



CODE

while (llll <=  rrrr)
{
 if (stop == true) {Form1->Label_scann->Caption = " ";return;}
 bt_c_1 = llll/16777216;
 bt_c_2 = (llll — bt_c_1*16777216)/65536;
 bt_c_3 = (llll — bt_c_1*16777216 — bt_c_2*65536)/256;
 bt_c_4 = (llll — bt_c_1*16777216 — bt_c_2*65536 — bt_c_3*256);
 if (bt_c_4 == 0 || bt_c_4 == 255) {llll++;continue;}
 sprintf(ip,"%d.%d.%d.%d",bt_c_1,bt_c_2,bt_c_3,bt_c_4);
 //Form1->Memo1->Lines->Add(ip);
 Form1->Label_scann->Caption = ip;
 Form1->IdUDPServer1->SendBuffer(ip,port_mas[i],"яяяяinfostring\0",15);
 ::Sleep(4);
 Form1->IdUDPServer1->SendBuffer(ip,port_mas[i],"яяяяTSource Engine Query\0",25);
 ::Sleep(4);
 Application->ProcessMessages();
 llll++;
 }
DENIS452
Отправлено: 31.10.2006, 15:46


Ученик-кочегар

Группа: Участник
Сообщений: 3



Я тут поэкспериментировал и пришёл к поразительному выводу что
цикл тормозит функция ::Sleep(n); вот результат работы двух запусков
цикла один с запущенной средой другой без.

В первом случае вместо 10 положенных секунд она выполнялась
12 во втором вообще 39!!!

Почему так?!

Чем можно заменить ::Sleep(n); что бы сделать паузу в коде с
погрешностью +-20% хотя б?



Начало [15:21:08]
Конец [15:21:20]
Начало [15:22:29]
Конец [15:23:08]

CODE

//---------------------------------------------------------------------------
#include <stdio.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char vremya[256];
SYSTEMTIME systime;
//////////////////////////////////////////////////////////////////////
GetLocalTime(&systime);
sprintf(vremya, "Начало [%d:%d:%02d]", systime.wHour, systime.wMinute, systime.wSecond);
Memo1->Lines->Add(vremya);
/////////////////////////////////////////////////////////////////////////////
for(int i =0; i <2500; i++)
{
::Sleep(4);
Application->ProcessMessages();
}
//////////////////////////////////////////////////////////////////////
GetLocalTime(&systime);
sprintf(vremya, "Конец [%d:%d:%02d]", systime.wHour, systime.wMinute, systime.wSecond);
Memo1->Lines->Add(vremya);
/////////////////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------
Doga
Отправлено: 31.10.2006, 16:39


Мастер участка

Группа: Участник
Сообщений: 575



Возможно Вам помогут функции QueryPerformanceFrequency и QueryPerformanceCounter.

Не так давно здесь была тема о них, поищите. Или сразу в MSDN
AVC
Отправлено: 31.10.2006, 17:04


Ветеран

Группа: Модератор
Сообщений: 1583



Sleep плохо отсчитывает итервалы менее 100 ms + надо учитывать какие еще процессы были активны в системе в момент проведения замеров.

Вернуться в Вопросы программирования в C++Builder