stop dfstatus from wasting time. added 'stopwatch.h' to extras for getting accurate unix time in milliseconds

develop
Petr Mrázek 2011-05-21 21:54:53 +02:00
parent 3fae382402
commit e5e0391d76
4 changed files with 70 additions and 12 deletions

@ -39,6 +39,7 @@ include/dfhack/VersionInfoFactory.h
include/dfhack/VersionInfo.h include/dfhack/VersionInfo.h
include/dfhack/extra/MapExtras.h include/dfhack/extra/MapExtras.h
include/dfhack/extra/termutil.h include/dfhack/extra/termutil.h
include/dfhack/extra/stopwatch.h
include/dfhack/modules/Buildings.h include/dfhack/modules/Buildings.h
include/dfhack/modules/Constructions.h include/dfhack/modules/Constructions.h
include/dfhack/modules/Creatures.h include/dfhack/modules/Creatures.h

@ -0,0 +1,45 @@
// source: http://stackoverflow.com/questions/1861294/how-to-calculate-execution-time-of-a-code-snippet-in-c
#ifndef LINUX_BUILD
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif
/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
* windows and linux. */
uint64_t GetTimeMs64()
{
#ifndef LINUX_BUILD
/* Windows */
FILETIME ft;
LARGE_INTEGER li;
/* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
* to a LARGE_INTEGER structure. */
GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
uint64_t ret = li.QuadPart;
ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */
return ret;
#else
/* Linux */
struct timeval tv;
gettimeofday(&tv, NULL);
uint64_t ret = tv.tv_usec;
/* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
ret /= 1000;
/* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
ret += (tv.tv_sec * 1000);
return ret;
#endif
}

@ -226,8 +226,6 @@ bool API::ReadInorganicMaterials (vector<t_matgloss> & inorganic)
} }
*/ */
// good for now // good for now
inline bool ReadNamesOnly(Process* p, uint32_t address, vector<t_matgloss> & names) inline bool ReadNamesOnly(Process* p, uint32_t address, vector<t_matgloss> & names)
{ {

@ -23,9 +23,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
using namespace std; using namespace std;
#define DFHACK_WANT_MISCUTILS
#include <DFHack.h> #include <DFHack.h>
#include <dfhack/DFVector.h> #include <dfhack/DFVector.h>
#include <dfhack/extra/stopwatch.h>
WINDOW *create_newwin(int height, int width, int starty, int startx); WINDOW *create_newwin(int height, int width, int starty, int startx);
@ -42,6 +42,9 @@ WINDOW *create_newwin(int height, int width, int starty, int startx);
int32_t copperBars = 0; int32_t copperBars = 0;
int32_t steelBars = 0; int32_t steelBars = 0;
int32_t fuel = 0; int32_t fuel = 0;
uint64_t start_time = 0;
uint64_t end_time = 0;
uint64_t total_time = 0;
WINDOW *create_newwin(int height, int width, int starty, int startx){ WINDOW *create_newwin(int height, int width, int starty, int startx){
WINDOW *local_win; WINDOW *local_win;
@ -64,7 +67,8 @@ WINDOW *create_newwin(int height, int width, int starty, int startx){
mvwprintw(local_win,5,22,"Copper Bars: %d", copperBars); mvwprintw(local_win,5,22,"Copper Bars: %d", copperBars);
mvwprintw(local_win,6,22,"Steel Bars: %d", steelBars); mvwprintw(local_win,6,22,"Steel Bars: %d", steelBars);
mvwprintw(local_win,8,22,"Fuel: %d", fuel); mvwprintw(local_win,8,22,"Fuel: %d", fuel);
total_time += end_time - start_time;
mvwprintw(local_win,12,2,"Time used: %d ms, Time total: %d ms", end_time - start_time, total_time);
wrefresh(local_win); // paint the screen and all components. wrefresh(local_win); // paint the screen and all components.
@ -79,21 +83,27 @@ int main()
DFHack::Process * p; DFHack::Process * p;
DFHack::ContextManager DFMgr("Memory.xml"); DFHack::ContextManager DFMgr("Memory.xml");
DFHack::Context * DF; DFHack::Context * DF;
DFHack::Materials * Materials;
try{ //is DF running? try{ //is DF running?
DF = DFMgr.getSingleContext(); DF = DFMgr.getSingleContext();
DF->Detach(); DF->Attach();
Materials = DF->getMaterials();
Materials->ReadAllMaterials();
DF->Resume();
} }
catch (exception& e){ catch (exception& e){
cerr << e.what() << endl; cerr << e.what() << endl;
return 1; return 1;
} }
//init and Attach //init and Attach
ofstream file("dfstatus_errors.txt");
streambuf* strm_buffer = cerr.rdbuf(); // save cerr's output buffer
cerr.rdbuf (file.rdbuf()); // redirect output into the file
initscr(); //start curses. initscr(); //start curses.
nonl(); nonl();
intrflush(stdscr, FALSE); intrflush(stdscr, FALSE);
keypad(stdscr, TRUE); keypad(stdscr, TRUE);
do{ do{
drinkCount = 0; drinkCount = 0;
plantCount = 0; plantCount = 0;
@ -111,10 +121,11 @@ int main()
//FILE * pFile; //FILE * pFile;
//pFile = fopen("dump.txt","w"); //pFile = fopen("dump.txt","w");
start_time = GetTimeMs64();
DF->Attach(); if(!DF->Suspend())
DFHack::Materials * Materials = DF->getMaterials(); {
Materials->ReadAllMaterials(); break;
}
//DFHack::Gui * Gui = DF->getGui(); //DFHack::Gui * Gui = DF->getGui();
@ -161,7 +172,8 @@ int main()
fprintf(pFile,"%5d: %12s - %64s - [%d]\n", idx, Items->getItemClass(itm.matdesc.itemType).c_str(), Items->getItemDescription(itm, Materials).c_str(), itm.quantity); fprintf(pFile,"%5d: %12s - %64s - [%d]\n", idx, Items->getItemClass(itm.matdesc.itemType).c_str(), Items->getItemDescription(itm, Materials).c_str(), itm.quantity);
}*/ }*/
} }
DF->Detach(); DF->Resume();
end_time = GetTimeMs64();
//printf("%d - %d\n", (clock()/CLOCKS_PER_SEC),(clock()/CLOCKS_PER_SEC)%60); //printf("%d - %d\n", (clock()/CLOCKS_PER_SEC),(clock()/CLOCKS_PER_SEC)%60);
height = LINES; height = LINES;
width = COLS; width = COLS;
@ -179,6 +191,8 @@ int main()
} while(true); } while(true);
endwin(); /* End curses mode */ endwin(); /* End curses mode */
cerr.rdbuf (strm_buffer); // restore old output buffer
file.close();
return 0; return 0;
} }