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,"яяяяinfostring\0",15);
::Sleep(4);
Form1->IdUDPServer1->SendBuffer(ip,port_mas,"яяяяTSource Engine Query\0",25);
::Sleep(4);
Application->ProcessMessages();
llll++;
}
Почему у меня цикл тормозит без среды (BDS2006)?!!!
Почему у меня этот цикл работает нормально тока при запущеной
среде (BDS2006) а без неё раза в 3 медленее?!!!
Тоесть, запускаю прогу она начинает кидать UDP пакеты
с определённой скоростью, ниже ожидаемой,просто запускаю среду-
скорость повышается до нормальной закрываю BDS2006 опять падает
раза в три!!!
Какие есть идеи?
Код:
Можно писать "if (Значение)" - для любого типа (приводимого к целочисленному) любое ненулевое значение будет ИСТИНА.
Можно писать "if (Значение == false)" - для любого типа (приводимого к целочисленному) ставрение нулевого значения будет ИСТИНА.
Можно писать "if (Значение != false)" - для любого типа (приводимого к целочисленному) сравнение любого ненулевого значения будет ИСТИНА.
но вот интересно "if (Значение == true)" при значении, равном true, фактически получается "if (true == true)", что есть банальная тавтология. Но это пол беды - результат будет ИСТИНА только для значения, равного единице (или -1) - для любого другого действительного значения (2, 5, 255, ....) результат будет ложным.
А зачем в переменной типа bool исспользовать другие значения кроме допустимых true и false. Вот чего надо не допускать. Ато вроде C-way не любим, а пользоваться продолжаем )
И конструкции типа "if (Pointer)" всё равно пользуем :D
Кроме того, есть типы OLE-результаты типа WORD_BOOL, "истина" которых равна -1.
В коде возможно есть вторая ошибка. Если код реализован в методе класса TForm1 (что более чем возможно), то писать Form1-> нельзя, потому что объектов класса TForm1 теоретически может быть много, а обращение при работе метода будет всегда производиться к Form1.
Нужно использовать this-> - указатель на "самого себя".
Что делает этот код?
Цитата:
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);
Если требуется определить остаток деления, то есть замечательный оператор %. А для "кратных" значений лучше использовать не десятичное, а шестнадцатеричное написание. Так нагляднее :)
Код:
bt_c_1 = llll / 0x1000000;
bt_c_2 = (llll % 0x1000000) / 0x10000;
bt_c_3 = (llll % 0x10000) / 0x100;
bt_c_4 = llll % 0x100;
bt_c_2 = (llll % 0x1000000) / 0x10000;
bt_c_3 = (llll % 0x10000) / 0x100;
bt_c_4 = llll % 0x100;
И конструкции типа "if (Pointer)" всё равно пользуем :D
Кроме того, есть типы OLE-результаты типа WORD_BOOL, "истина" которых равна -1.
[/QUOTE]
При чем тут указатели и другие типы? Если есть переменная типа bool, то она в идеале должна равняться или true или flase и сравниваться только с ними, все остальное и присвоение ей других типов - некорректно.
Вполне возможно, что код не оптимален, и можно его написать так что
он будет работать быстрее, но вопрос в том, почему он работает с разной скоростью, когда прогу запускаешь при запущенном BDS2006
(при открытом проекте этой проги но exe файл я запускаю просто обычным способом, даже не из среды) и она работает как положено
то есть цикл выполняется за 10 млсек. - 2 млсек все остальное кроме
слипа?
Если я закрываю BDS 2006 во время работы цикла, то он прямо на глазах
тормозит в 3 раза! 30 мсек уходит на выполнение.
цикл тормозит функция ::Sleep(n); вот результат работы двух запусков
цикла один с запущенной средой другой без.
В первом случае вместо 10 положенных секунд она выполнялась
12 во втором вообще 39!!!
Почему так?!
Чем можно заменить ::Sleep(n); что бы сделать паузу в коде с
погрешностью +-20% хотя б?
Начало [15:21:08]
Конец [15:21:20]
Начало [15:22:29]
Конец [15:23:08]
Код:
//---------------------------------------------------------------------------
#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);
/////////////////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------
#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);
/////////////////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------
Цитата:
Чем можно заменить ::Sleep(n); что бы сделать паузу в коде с
погрешностью +-20% хотя б?
погрешностью +-20% хотя б?
Таймером - сложно, зато никаких "тормозов" с интерфейсом формы.
Добавить на форму поле Stage - этап работы с сетью:
Код:
enum TeStage {stNone = 0, Send1, Send2, ... SendEnd}; // Перечисляемый тип для поля Stage
void TForm1::Timer1Timer (TObject *Sender) // Обработчик таймера
{
TTimer *Timer = (TTimer*) Sender;
Timer->Enabled = false;
this->Step_Sending ();
}
void TForm1::Step_Sending (void)
{[INDENT]switch (_fStage) // Выбор текущего этапа отсылки
{
case stNone: // Начало рассылки
// Подготовка расслыки, отправка первого сообщения
_fStage = stSend1;
this->Timer1->Enabled = true; // Запуск таймера;
break;
case StSend1: // После первого этапа
// Отправка второго сообщения
_fStage = stSend2;
this->Timer1->Enabled = true; // Запуск таймера;
break;
//... другие определённые значения для _fStage
case stSendEnd: // После последнего сообщения
// Завершение работы с сообщениями
_fStage = stNone;
break;
}
[/INDENT]}
void TForm1::Timer1Timer (TObject *Sender) // Обработчик таймера
{
TTimer *Timer = (TTimer*) Sender;
Timer->Enabled = false;
this->Step_Sending ();
}
void TForm1::Step_Sending (void)
{[INDENT]switch (_fStage) // Выбор текущего этапа отсылки
{
case stNone: // Начало рассылки
// Подготовка расслыки, отправка первого сообщения
_fStage = stSend1;
this->Timer1->Enabled = true; // Запуск таймера;
break;
case StSend1: // После первого этапа
// Отправка второго сообщения
_fStage = stSend2;
this->Timer1->Enabled = true; // Запуск таймера;
break;
//... другие определённые значения для _fStage
case stSendEnd: // После последнего сообщения
// Завершение работы с сообщениями
_fStage = stNone;
break;
}
[/INDENT]}
Неуклюже - но неужели вообще требуется эта задержка?
4 мсек? Если да то где можно найти исходники компонента
"таймер" что б посмотреть как это они делают?
Видимо через виндовый таймер ))
Если да то где можно найти исходники компонента "таймер" что б посмотреть как это они делают?[/QUOTE]
1. Не знаю - не проверял.
2. Исходники всех компонентов VCL расположены в каталоге "C:\Program Files\Borland\CBuilder6\Source". Только предупреждаю сразу - VCL написана на Delphi :D