In questo momento, sto lavorando al refactoring di un programma che chiama le sue parti eseguendo il polling su una struttura più guidata dagli eventi.
Ho creato le classi di pianificazione e attività con lo sced per diventare una base classe del ciclo principale corrente. Le attività saranno create per ciascuno metro in modo che possano essere richiamati da quello invece del polling.
Ciascuna delle chiamate principali degli eventi è un tipo di contatore che raccoglie informazioni e mostralo. Quando il programma sta arrivando, tutti i metri abilitati ottenere 'costruito' da un main-sub. In quel sottotitolo, voglio memorizza anche il puntatore "questo" associato al contatore come il nome comune per la "routine di azione.
void MeterMaker::Meter_n_Task (Meter * newmeter,) {
push(newmeter); // handle non-timed draw events
Task t = new Task(now() + 0.5L);
t.period={0,1U};
t.work_meter = newmeter;
t.work = [&newmeter](){newmeter.checkevent();};<<--attempt at lambda
t.flags = T_Repeat;
t.enable_task();
_xos->sched_insert(t);
}
Una chiamata di esempio:
Meter_n_Task(new CPUMeter(_xos, "CPU "));
ha reso lo schedulatore una classe base della routine principale (che gestisce il ciclo), e ho provato varianti serveral per ottenere la classe di attività essere una base della classe metro, ma continuare a correre nei posti di blocco. È molto simile a "whack-a-mole" - sterlina in qualcosa per aggiustare qualcosa posto, e poi un nuovo file si apre altrove.
Parte del problema è il file sched.h che sta provando per contenere l'attività Q, include il file di intestazione dell'attività. L'obiettivo file Vuole fare riferimento alla classe più "base", Meter .
La classe del misuratore tira nella classe principale del genitore mentre passa una copia del genitore ai bambini in modo che possano accedere al sorteggio routine nel genitore.
Due riferimenti nel file di attività sono per il puntatore "this" di il contatore e il sottomenu di aggiornamento del contatore (da chiamare tramite questo).
void *this_data= NULL;
void (*this_func)() = NULL;
Nota: non volevo davvero memorizzarli nella classe, come volevo per usare un lamdba nella routine di lavoro del metronomo sopra indicata memorizzare una routine + contesto da utilizzare per chiamare la routine di azione dello strumento.
Impossibile capire la sintassi.
Ma sto correndo in altri problemi di sintassi che cercano di memorizzare il file puntatori ... come
g++: COMPILE lsched.cc
In file included from meter.h:13:0,
from ltask.h:17,
from lsched.h:13,
from lsched.cc:13:
xosview.h:30:47: error: expected class-name before ‘{’ token
class XOSView : public XWin, public Scheduler {
Come sopra dove chiede una classe, dove è il nome di classe "Scheduler". !?!? Eh? Questo è un nome di classe.
Continuo ad andare in cerchio con cose che non hanno senso ... Idealmente, farei funzionare la lamba nella routine Meter_n_Task in cima. Volevo solo memorizzare 1 puntatore nel 'Task' classe che era un puntatore al mio lambda che avrebbe già catturato il "questo" valore ... ma non è riuscito a far funzionare la sintassi affatto quando ho provato ad avviarlo in una var nella classe 'Task'.
Questo progetto, FWIW, è il mio progetto di dentizione sul nuovo C ++ ... (ovviamente è semplice! ..; -)) ... Ho fatto un bel po 'di progressi in altri aree nel codice, ma questa sintassi lambda mi ha bloccato ... è a volte come quello che apprezzo la facilità di questo tipo di operazione in perl. Sigh.
Non sono sicuro che il modo migliore per chiedere aiuto qui, in quanto questo non è un semplice domanda. Ma ho pensato di provare! ...; -)
Peccato che non possa allegare file a questo Q.