#include <UpdateHandler.h>
Public Methods | |
bool | setCapture (const TString &, const TString &, const int, const int) |
Sets capture information. | |
bool | setCaptureName (const TString &) |
Sets just the capture name. | |
bool | setCaptureDir (const TString &) |
Sets the capture directory. | |
bool | setCaptureLimit (const int) |
Sets the capture limit. | |
bool | setCaptureFrequency (const int) |
Sets the capture Frequency. | |
void | disableCapture () |
Stops the capture of screen images. | |
bool | enableCapture () |
Enables the capture of screen images. | |
const TString | getCaptureName () const |
get the capture name TString. | |
const TString | getCaptureDir () const |
get the capture directory TString. | |
int | getCaptureLimit () const |
get the capture limit. | |
int | getCaptureFrequency () const |
get the cpature Frequency. | |
void | stop (const bool=true) |
bool | run () |
UpdateHandler (ScreenPipe &, BitmapScreen &, HWND) | |
virtual | ~UpdateHandler () |
Static Private Methods | |
DWORD WINAPI | update (LPVOID) |
Private Attributes | |
HANDLE | hUpdateThread |
Handle to the update thread. | |
volatile bool | exit |
true when update thread should terminate. | |
BitmapScreen * | screen |
Pointer to the BitmapScreen. | |
ScreenPipe * | pipe |
Pointer to the ScreenPipe. | |
const HWND | hWnd |
Handle to the main window. | |
HANDLE | captureMutex |
A Handle to a Mutex protecting the capture details during capture. | |
TString | captureName |
The base name (to which the frame number is appended) of the .bmp file. | |
TString | captureDir |
The directory for storing the captures. | |
int | captureEvery |
The capture Frequency. | |
int | captureLimit |
The number of captures to perform. | |
volatile bool | capture |
Boolean indicating that screen captures should be performed. |
Definition at line 24 of file UpdateHandler.h.
|
Takes a reference to a ScreenPipe and BitmapScreen and initialises the object.
Definition at line 21 of file UpdateHandler.cpp. References capture, captureEvery, captureLimit, captureMutex, captureName, hUpdateThread, pipe, and screen.
00022 :hWnd(h) 00023 { 00024 pipe = &s; 00025 screen = &b; 00026 hUpdateThread = NULL; 00027 00028 captureName = TEXT("ScreenCap_"); 00029 captureEvery = 1; 00030 captureLimit = 50; 00031 capture = false; 00032 00033 captureMutex = CreateMutex(NULL, false, NULL); 00034 } |
|
Object Destructor Definition at line 39 of file UpdateHandler.cpp. References captureMutex, hUpdateThread, and stop().
00040 { 00041 stop(true); 00042 CloseHandle(captureMutex); 00043 CloseHandle(hUpdateThread); 00044 } |
|
Starts the update thread Definition at line 53 of file UpdateHandler.cpp. References exit, hUpdateThread, and update(). Referenced by Cls_OnCommand().
00054 { 00055 DWORD exitCode; 00056 GetExitCodeThread(hUpdateThread, &exitCode); 00057 00058 if( exitCode == STILL_ACTIVE ) 00059 return true; 00060 00061 exit = false; 00062 00063 CloseHandle(hUpdateThread); 00064 00065 hUpdateThread = chBEGINTHREADEX( 00066 NULL, // Default Security, non inheritable 00067 0, // use default stack size 00068 &update, // thread function 00069 this, // thread argument 00070 0, // use default creation flags 00071 NULL); // don't need thread identifier 00072 00073 if(hUpdateThread == NULL){ 00074 return false; 00075 } 00076 00077 return true; 00078 } |
|
Stops the update thread Definition at line 83 of file UpdateHandler.cpp. References exit, and hUpdateThread. Referenced by Cls_OnCommand(), and ~UpdateHandler().
00084 { 00085 exit = true; // Signal thread to stop 00086 00087 DWORD exitCode; 00088 GetExitCodeThread(hUpdateThread, &exitCode); 00089 00090 // If still active after a second terminate the thread 00091 if( force && exitCode == STILL_ACTIVE ){ 00092 if( WaitForSingleObject(hUpdateThread, 1000) == WAIT_TIMEOUT ) 00094 TerminateThread(hUpdateThread, 0); 00095 } 00096 00097 } |
|
The update thread. Takes possesion of the capture Mutex and loops the reading of a screen buffer and possible capture of the image until told to quit. Definition at line 104 of file UpdateHandler.cpp. References capture, captureDir, captureEvery, captureLimit, captureMutex, captureName, BitmapScreen::DoneReading(), BitmapScreen::DoneWriting(), exit, BitmapScreen::getReadBuffer(), BitmapScreen::getWriteBuffer(), hWnd, VScreen::invalidate(), pipe, ScreenPipe::readToDIB(), DIBitmap::saveFile(), screen, SP_ERROR_CREATING_BITMAP, SP_INVALID_DATA, SP_NOT_CONNECTED, SP_SUCCESS, SP_UNKNOWN_ERROR, and update(). Referenced by run(), and update().
00105 { 00106 UpdateHandler* update = (UpdateHandler*) param; 00107 00108 WaitForSingleObject(update->captureMutex, INFINITE); 00109 00110 if( !(!update->captureDir) ){ // not empty 00111 if( !SetCurrentDirectory(update->captureDir) ) 00112 update->capture = false; 00113 } 00114 00115 if( !update->captureName ){ // is empty 00116 update->capture = false; 00117 } 00118 00119 int screenNum = -1; // screenNo incremented before use 00120 int captureNum = 1; 00121 bool success; 00122 ULARGE_INTEGER freeBytes, notNeeded; 00123 00124 DIBitmap *writeBuffer; 00125 const DIBitmap *readBuffer; 00126 00127 DWORD readResult; 00128 while(!update->exit){ 00129 00130 writeBuffer = update->screen->getWriteBuffer(); 00131 00132 readResult = update->pipe->readToDIB(*writeBuffer); 00133 00134 update->screen->DoneWriting(); 00135 00136 switch(readResult){ 00137 case SP_SUCCESS: 00138 break; 00139 case SP_UNKNOWN_ERROR: 00140 case SP_ERROR_CREATING_BITMAP: 00141 case SP_NOT_CONNECTED: 00142 case SP_INVALID_DATA: 00143 default: 00144 return false; // Abandons mutex 00145 } 00146 00147 update->screen->invalidate(update->hWnd); 00148 00149 // restart loop if signaled to exit 00150 if(update->exit) 00151 continue; 00152 00153 screenNum++; 00154 00155 // Check that we wish to capture this screen 00156 if( !update->capture || !((screenNum % update->captureEvery) == 0) ) 00157 continue; 00158 00159 // Check we haven't reached capture limit; 00160 if( update->captureLimit != 0 && captureNum > update->captureLimit ){ 00161 update->capture = false; 00162 continue; 00163 } 00164 00165 readBuffer = update->screen->getReadBuffer(); 00166 00167 // Write buffer to disk 00168 success = readBuffer->saveFile( 00169 update->captureName + TString(screenNum) + TString(TEXT(".bmp")) ); 00170 00171 update->screen->DoneReading(); 00172 00173 captureNum++; 00174 00175 if( !success ){ 00176 GetDiskFreeSpaceEx(NULL, &freeBytes, ¬Needed, NULL); 00177 if(freeBytes.QuadPart < 1024 * 1024){ // less than a megabyte 00178 update->capture = false; // Stop capturing 00179 } 00180 } 00181 00182 } 00183 00184 ReleaseMutex(update->captureMutex); 00185 00186 return true; 00187 } |