campo-sirio/ba/ba1200.cpp
guy c6b1ca245f Patch level : 10.0
Files correlati     : ba0 ba1
Ricompilazione Demo : [ ]
Commento            :
Corretta gestione menu e barre in programmi manutenzione


git-svn-id: svn://10.65.10.50/trunk@16743 c028cbd2-c16b-5b4b-a496-9718f37d4682
2008-06-13 08:41:37 +00:00

371 lines
8.2 KiB
C++
Executable File

#include <applicat.h>
#include <mask.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <tabutil.h>
#include <reputils.h>
#include <urldefid.h>
class TProfiler_mask : public TMask
{
public:
TProfiler_mask();
};
TProfiler_mask::TProfiler_mask() : TMask(TR("Test"), 1, 60, 12)
{
create_bar(-2);
TToken_string codes, items;
codes.add(0); items.add(TR("Tutti i test"));
codes.add(1); items.add(TR("Lettura sequenziale tabella"));
codes.add(2); items.add(TR("Lettura cursore su chiave primaria"));
codes.add(3); items.add(TR("Lettura cursore con ordinamento fuori chiave"));
codes.add(4); items.add(TR("Lettura causale con cache"));
codes.add(5); items.add(TR("Creazione e cancellazione records"));
add_radio(101, 0, TR("@bSelezione test"), 1, 1, 58, codes, items);
add_number(102, 0, PR("Numero di iterazioni"), 1, 0, 3, "U");
add_button(DLG_OK, MAX_PAGES, PR("Elabora"), -12, -11, 10, 2, "", BMP_ELABORA);
add_button(DLG_QUIT, MAX_PAGES, "", -22, -11, 10, 2);
}
///////////////////////////////////////////////////////////
// Testfile
///////////////////////////////////////////////////////////
class TTest_application : public TSkeleton_application
{
TProgind* _pi;
clock_t start_timer() const;
clock_t start_progind(const long items, const char* prompt);
clock_t stop_progind();
protected:
bool test1(TLog_report& log);
bool test2(TLog_report& log);
bool test3(TLog_report& log);
bool test4(TLog_report& log);
bool test5(TLog_report& log);
public:
bool test(int n, TLog_report& log);
virtual void main_loop();
TTest_application() : _pi(NULL) { }
};
clock_t TTest_application::start_timer() const
{
clock_t t = clock();
while (clock() == t);
t = clock();
return t;
}
clock_t TTest_application::start_progind(const long items, const char* prompt)
{
CHECK(_pi == NULL, "Double progress indicator");
_pi = new TProgind(items, prompt, true, true);
return start_timer();
}
clock_t TTest_application::stop_progind()
{
clock_t t = clock();
if (_pi != NULL)
{
delete _pi;
_pi = NULL;
}
return t;
}
bool TTest_application::test1(TLog_report& log)
{
bool ok = true;
TLocalisamfile tab(LF_COMUNI);
TRecnotype r = 0;
TString80 msg;
const int times = 10;
const clock_t start = start_progind(times, TR("Lettura file comuni"));
for (int i = 0; i < times; i++)
{
for (tab.first(); tab.good(); tab.next())
r++;
msg.format("%ld records %ld msec", r, clock() - start);
_pi->set_text(msg);
if (!_pi->addstatus(1))
{
log.log(1, TR("Interrotto dall'utente"));
ok = false;
break;
}
}
const clock_t t = stop_progind() - start;
msg.format("Lettura file comuni - "
"%ld records in %ld msec - %lg records per sec", r, t, 1000.0*r/t);
log.log(0, msg);
return ok;
}
bool TTest_application::test2(TLog_report& log)
{
bool ok = true;
TRelation rel(LF_COMUNI);
TCursor tab(&rel);
const TRecnotype n = tab.items();
tab.freeze();
clock_t start;
TRecnotype r = 0;
TString80 msg;
{
const int times = 10;
TProgind p(times, TR("Lettura cursore comuni"), TRUE, TRUE);
start = start_timer();
for (int i = 0; i < times; i++)
{
for (tab = 0; tab.pos() < n; ++tab)
r++;
msg.format("Lettura cursore comuni\n%ld records %ld msec", r, clock() - start);
p.set_text(msg);
if (!p.addstatus(1))
{
log.log(1, TR("Interrotto dall'utente"));
ok = false;
break;
}
}
}
const clock_t t = clock() - start;
msg.format("Lettura cursore comuni: %ld records in %ld msec - %lg records per sec\n",
r, t, 1000.0*r/t);
log.log(0, msg);
return ok;
}
bool TTest_application::test3(TLog_report& log)
{
bool ok = true;
TRelation rel(LF_COMUNI);
TSorted_cursor tab(&rel, "CAPCOM|DENCOM");
clock_t istart = start_timer();
const TRecnotype n = tab.items();
clock_t istop = clock() - istart;
tab.freeze();
clock_t start;
TRecnotype r = 0;
TString256 msg;
{
const int times = 10;
TProgind p(times, TR("Lettura cursore C.A.P."), TRUE, TRUE);
start = start_timer();
for (int i = 0; i < times; i++)
{
for (tab = 0; tab.pos() < n; ++tab)
r++;
msg.format("Lettura cursore C.A.P.\n%ld records %ld msec", r, clock() - start);
p.set_text(msg);
if (!p.addstatus(1))
{
log.log(1, TR("Interrotto dall'utente"));
ok = false;
break;
}
}
}
const clock_t t = clock() - start;
msg.format("Lettura cursore ordinato %ld records in %ld msec - %lg records per sec - "
"%ld msec for initialization",
r, t, 1000.0*r/t, istop);
log.log(0, msg);
return ok;
}
bool TTest_application::test4(TLog_report& log)
{
bool ok = true;
long r = 0;
srand(r);
TString8 cod;
clock_t start;
{
const int times = 10;
TProgind p(times, TR("Lettura casuale tramite cache"), TRUE, TRUE);
cache().get(LF_COMUNI, cod); // Inizializzazione
start = start_timer();
for (int i = 0; i < times; i++)
{
for (long j = 0; j < 10000; j++)
{
cod.format(" |%c%03d", 'A'+rand()%8, rand() % 1000);
cache().get(LF_COMUNI, cod);
r++;
}
if (!p.addstatus(1))
{
log.log(1, TR("Interrotto dall'utente"));
ok = false;
break;
}
}
}
const clock_t t = clock() - start;
TString msg;
msg.format("Lettura casuale di %ld records in %ld msec - %lg records per sec",
r, t, 1000.0*r/t);
log.log(0, msg);
return ok;
}
bool TTest_application::test5(TLog_report& log)
{
bool ok = true;
TString msg;
TRecnotype n = 200;
if (n > 0)
{
TTable tab("CZZ");
msg.format("Creazione di %ld records", n);
const clock_t start = start_progind(n, msg);
int i;
for (i = 0; i < n; i++)
{
tab.put("CODTAB", i+1);
tab.write();
if (!_pi->addstatus(1))
{
log.log(1, TR("Interrotto dall'utente"));
ok = false;
break;
}
}
const clock_t t = stop_progind() - start;
msg.format("Scritti %ld records in %ld msec - %lg records per sec", i, t, 1000.0*i/t);
log.log(0, msg);
}
if (n > 0)
{
TRelation rel("CZZ");
TCursor cur(&rel);
n = cur.items();
cur.freeze();
msg.format("Cancellazione %ld records", n);
const clock_t start = start_progind(n, msg);
for (cur = 0; cur.pos() < n; ++cur)
{
cur.file().remove();
if (!_pi->addstatus(1))
{
log.log(1, TR("Interrotto dall'utente"));
ok = false;
break;
}
}
const clock_t t = stop_progind() - start;
msg.format("Cancellati %ld records in %ld msec - %lg records per sec", n, t, 1000.0*n/t);
log.log(0, msg);
}
return ok;
}
bool TTest_application::test(int n, TLog_report& log)
{
bool ok = false;
switch (n)
{
case 1: ok = test1(log); break;
case 2: ok = test2(log); break;
case 3: ok = test3(log); break;
case 4: ok = test4(log); break;
case 5: ok = test5(log); break;
default: ok = false; break;
}
return ok;
}
void TTest_application::main_loop()
{
int te = -1;
int ti = 3;
for (int a = argc()-1; a > 1; a--)
{
const TFixed_string t(argv(a));
if (t.starts_with("test="))
te = atoi(t.mid(5)); else
if (t.starts_with("times="))
ti = atoi(t.mid(6));
}
const bool interactive = te < 0;
while (true)
{
if (interactive)
{
TProfiler_mask m;
m.set(101, te);
m.set(102, ti);
if (m.run() == K_QUIT)
break;
te = m.get_int(101);
ti = m.get_int(102);
if (ti <= 0)
ti = 1;
}
TLog_report log("Report");
bool ok = true;
for (int t = 1; ok && t <= 5; t++)
{
if (te <= 0 || te == t)
{
log.log(0, "");
for (int i = 0; ok && i < ti; i++)
ok = test(t, log);
}
}
if (interactive)
log.preview();
else
break;
}
}
///////////////////////////////////////////////////////////
int ba1200(int argc, char** argv)
{
TTest_application a;
a.run(argc, argv, TR("Test File"));
return 0;
}