Diese Vorschlag ist in einem anderen Forum entstanden als wir diskutierten wie man einem Tap erstellen könnten, der andere Taps startet. Aber der Grund für diese Wünsch ist eigentlich, dass man den Topf sofort bedienen will, ohne auf den Auto-startendem Taps zu warten.
Diese Vorschlag beschreibt wie man ein Tap leicht umprogrammieren kann, damit es unauffällig startet.
Es basiert auf folgenden Prämisse:
- Ein Tap hat ein Initialisierungsroutine der lange dauern darf, solange es die Bedienung der Topf nicht verhindert
- Dieses kann man ermöglichen, in dem man bei jedem Zeit-intensiven Aktion die Kontrolle an der Topf OS zurückgibt damit Tastendrücke von Topf abarbeitet werden. z.B. Wenn innerhalb eine Schleife bei jedem Durchlauf die Kontrolle an der Topf OS kurzzeitig übergeben wird.
- Der Tap selbst darf nicht normal arbeiten (also keine Tastendrücke selbst bearbeiten) bis der Initialisierung vorbei ist
- Am Ende der Initialisierung schaltet der Tap um und funktioniert wie normal.
1) Man erstellt einen Ersatz-Funktion für einer (oder mehrere) verwendeten TAP APIs (z.B. TAP_MemAlloc oder TAP_HDD_Fread) und macht ein Redirect auf diesem Funktion. Es macht nur Sinn ein TAP API zu wählen der innerhalb einem Schleife aufgerufen wird. Diese neue Routine enthält einem Aufruf von TAP_SystemProc damit die Kontrolle kurzzeitig an der Topf OS geht.
Code: Alles auswählen
new_TAP_HDD_Fread(..)
{
TAP_SystemProc();
orig_TAP_HDD_Fread(...);
}
Code: Alles auswählen
TAP_main
{
orig_TAP_HDD_Fread = &TAP_HDD_Fread;
TAP_HDD_Fread = &new_TAP_HDD_Fread;
...
}Code: Alles auswählen
TAP_main
{
g_Idle_handler = &init_idle_handler;
g_Key_handler = &init_key_handler;
}
TAP_EventHandler( ... )
{
if ( event == EVT_IDLE )
return g_Idle_Handler( ...);
if ( event == EVT_KEY )
return g_Key_Handler( ...);
return dwParam1;
}
init_key_handler (..)
{
}
init_event_handler (..)
{
if !g_started // forbid reentry
init( );
}
init()
{
g_started = TRUE;
for ...
...
TAP_HDD_Fread(..);
....
}Code: Alles auswählen
init
{
....
// init aufraümen
g_Idle_Handler = &normal_idle_handler;
g_ Key_Handler = &normal_key_handler;
TAP_HDD_Fread = old_TAP_hdd_Fread;
}Das gute an diesem Algorithmus ist, dass man eine bestehende Tap schnell ändern kann ohne in der Tap-Logik einzugreifen. Es ist generisch anwendbar.
Ich habe es mit Lucky B's Geburtstagskalendar Tap ausprobiert um zu sehen ob es wirkt und es hat doch funktioniert. Ich konnte der Tap Bedienung während die Initialisierung lief
(An dieser Stelle eine dicke Willkommen an Lucky zu diese Forum
Also, jetzt - Frage an Euch. Es ist immer komplizierte als man denkt. Was habe ich in diesem Methodik übersehen?
Gruß,
ICTag
PS: Es könnte sein, dass ein billig Version diese Algorithmus wäre einfach eine TAP_SystemProc aufzurufen innerhalb jedem Schleife im Initialisierungsroutine?


