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 + надо учитывать какие еще процессы были активны в системе в момент проведения замеров. |
|
|