Skip to content

Instantly share code, notes, and snippets.

@iNewLegend
Created October 27, 2016 09:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iNewLegend/13a5c7fe53811e5b05f47082496ed7ff to your computer and use it in GitHub Desktop.
Save iNewLegend/13a5c7fe53811e5b05f47082496ed7ff to your computer and use it in GitHub Desktop.
Log ObServer example
#include <list>
#include <stdio.h>
#include <stdarg.h>
#include <Windows.h>
class CObServer
{
public:
virtual void notify(std::string log) {};
};
bool m_status;
class CLogConsole : public CObServer
{
protected:
static void worker()
{
AllocConsole();
do {
Sleep(1);
} while (m_status);
};
public:
CLogConsole()
{
DWORD dwId;
m_status = true;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CLogConsole::worker, 0, 0, &dwId);
};
~CLogConsole()
{
m_status = false;
};
void notify(std::string log)
{
DWORD dwBytesWritten;
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(Handle, log.c_str(), log.length(), &dwBytesWritten, NULL);
};
};
class CLog
{
protected:
std::list<CObServer *> m_obServers;
void notifyObservers(std::string log)
{
for (std::list<CObServer *>::iterator it = m_obServers.begin(); it != m_obServers.end(); it++) {
(*it)->notify(log);
}
};
public:
void attach(CObServer * obServer)
{
m_obServers.push_back(obServer);
};
void deattach(CObServer * obServer)
{
m_obServers.remove(obServer);
};
void write(char * szFormat, ...)
{
static char szTemp[1024];
memset(szTemp, 0, sizeof(szTemp));
va_list args;
va_start(args, szFormat);
vsprintf_s(szTemp, szFormat, args);
va_end(args);
notifyObservers(szTemp);
};
};
int main()
{
CLog gLog;
CLogConsole gLogConsole;
gLog.attach(& gLogConsole);
gLog.write("%s", "test");
system("pause");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment