more work on testMenu

This commit is contained in:
2025-03-13 16:38:10 -05:00
parent d9ef1122ee
commit bc09e0d79b
6 changed files with 35 additions and 15 deletions

View File

@@ -4,14 +4,17 @@ TestMenu::TestMenu(void* h) {
handle = h; handle = h;
} }
TestMenu::~TestMenu() {} TestMenu::~TestMenu() {
std::cout << "TestMenu Destroyed!\n";
}
void TestMenu::run() { void TestMenu::run() {
std::cout << "Your number is: " << num << "\n" std::cout << "Your number is: " << num << "\n"
<< "1. Add 1\n" << "1. Add 1\n"
<< "2. Subtract 1\n" << "2. Subtract 1\n"
<< "3. Quit\n\n"; << "3. Unload Module\n\n"
<< "4. Quit\n\n";
std::cin >> choice; std::cin >> choice;
@@ -23,6 +26,9 @@ void TestMenu::run() {
num--; num--;
break; break;
case 3: case 3:
App::Get().unload(self);
break;
case 4:
App::Get().end(); App::Get().end();
break; break;
default: default:

View File

@@ -16,8 +16,4 @@ extern "C" {
Module* create(void* handle) { Module* create(void* handle) {
return new TestMenu(handle); return new TestMenu(handle);
} }
void destroy(Module* m) {
delete m;
}
} }

View File

@@ -20,15 +20,19 @@ App::App(const int& argc, char* argv[]) {
App::~App() { App::~App() {
std::cout << "\nExiting..."; std::cout << "\nExiting...";
for(auto it = modules.begin(); it != modules.end(); it++) {
void* handle = (*it)->getHandle();
delete *it;
dlclose(handle);
modules.erase(it);
}
} }
void App::run() { void App::run() {
std::cout << "\nTesting...\n"; std::cout << "\nTesting...\n";
done = modules.empty();
// Main loop // Main loop
while (!done) { while (!done && !modules.empty()) {
for(auto it = modules.begin(); it != modules.end(); it++) for(auto it = modules.begin(); it != modules.end(); it++)
(*it)->run(); (*it)->run();
@@ -65,10 +69,22 @@ void App::load(std::string lib) {
} }
} }
void App::unload(std::list<Module*>::iterator it) {
void* handle = (*it)->getHandle();
delete *it;
dlclose(handle);
modules.erase(it);
}
void App::handleArgs(const int& argc, char* argv[]) { void App::handleArgs(const int& argc, char* argv[]) {
int i = 0; int i = 0;
if(argc == 0) {
printHelp();
end();
}
while(i < argc) { while(i < argc) {
if(strcmp(argv[i], "-h") == 0) { if(strcmp(argv[i], "-h") == 0) {
printHelp(); printHelp();

View File

@@ -12,9 +12,7 @@ class App {
bool done; bool done;
std::vector<Module*> modules; std::list<Module*> modules;
std::vector<Module::create_t> mCreators;
std::vector<Module::destroy_t> mDestroyers;
public: public:
App(const int&, char*[]); App(const int&, char*[]);
@@ -26,11 +24,13 @@ class App {
void load(std::string); void load(std::string);
void unload(std::list<Module*>::iterator);
void handleArgs(const int&, char*[]); void handleArgs(const int&, char*[]);
void printHelp(); void printHelp();
void end() { done = true; }; void end() { done = true; }
}; };
#endif #endif

View File

@@ -7,16 +7,18 @@ class Module {
public: public:
typedef Module* create_t(void*); typedef Module* create_t(void*);
typedef void destroy_t(Module*); typedef void* destroy_t(Module*);
virtual ~Module() {} virtual ~Module() {}
virtual void run() = 0; virtual void run() = 0;
std::string getName() const { return name; } std::string getName() const { return name; }
void* getHandle() { return handle; }
protected: protected:
std::string name; std::string name;
void* handle; void* handle;
std::list<Module*>::iterator self;
}; };
#endif #endif

View File

@@ -3,7 +3,7 @@
#include <iostream> #include <iostream>
#include <cstring> #include <cstring>
#include <vector> #include <list>
#include <dlfcn.h> #include <dlfcn.h>