--- nono/vm/vm.cpp 2026/04/29 17:05:46 1.1.1.14 +++ nono/vm/vm.cpp 2026/04/29 17:05:50 1.1.1.15 @@ -10,11 +10,13 @@ #include "vm.h" #include "debugger.h" +#include "event.h" #include "mainapp.h" #include "mainbus.h" #include "scheduler.h" #include "signalthread.h" #include "syncer.h" +#include "uimessage.h" // コンストラクタ VM::VM(const char *vmname_) @@ -23,11 +25,13 @@ VM::VM(const char *vmname_) assert(vmname); // SignalThread は他のスレッドより先に起動する必要があるので、先頭。 + // EventManager は Scheduler に必要。 // Scheduler は以降の他のデバイスからのイベント登録を受け付ける必要が // あるためその次。 // Debugger は HostCOM と stdio ドライバが競合した場合に優先したいため // もあって必ず先に配置する必要がある。 NEWDV(SignalThread, new SignalThread()); + NEWDV(EventManager, new EventManager()); NEWDV(Scheduler, new Scheduler()); NEWDV(Syncer, new Syncer()); NEWDV(Debugger, new Debugger()); @@ -43,7 +47,10 @@ VM::~VM() void VM::Dispose() { - // まずスレッドを止める。 + // (もう止まってるはずだが) 念のため UIMessage の送出を止める。 + gMainApp.GetUIMessage()->StopUIMessage(); + + // スレッドを止める。 // デバッガスレッドがスケジューラスレッドにアクセスするのでデバッガが先。 if ((bool)pDebugger) { GetDebugger()->TerminateThread(); @@ -69,6 +76,10 @@ VM::Dispose() pScheduler.reset(); } + if ((bool)pEventManager) { + pEventManager.reset(); + } + // ほかのオブジェクトの解放はグローバルデストラクタにおまかせ。 // だめだったらまた考える。 } @@ -104,6 +115,20 @@ VM::Create(VM::CreationPhase phase) } } + // 名無しオブジェクトがあれば開発中に検出したい。 + // 名無しでも動作には影響ないのでリリース版では怒られないでほしい。 +#if !defined(RELEASE) + for (auto obj : gMainApp.GetObjects()) { + if (obj->GetName().empty()) { + printf("Objects:\n"); + for (auto o : gMainApp.GetObjects()) { + printf("%s\n", o->GetName().c_str()); + } + assert(obj->GetName().empty() == false); + } + } +#endif + return true; } @@ -146,22 +171,6 @@ VM::StartThread() return false; } } - } - - return true; -} - -// 設定の適用 -bool -VM::Apply() -{ - for (auto obj : gMainApp.GetObjects()) { - auto dev = dynamic_cast(obj); - if (dev) { - if (!dev->Apply()) { - return false; - } - } } return true;