Questo è un po 'correlato a this question, ma penso che ho bisogno di sapere un po' di più. Ho cercato di capire come farlo per alcuni giorni (mentre lavoravo su altre parti), ma è giunto il momento per me di mordere il proiettile e ottenere multi-thread. Inoltre, sto cercando un po 'più di informazioni rispetto alla domanda collegata.boost :: asio, thread e sincronizzazione
In primo luogo, sulla multi-threading. Come ho provato il mio codice, non mi sono preoccupato di nessun multi-threading. È solo un'applicazione di console che avvia una connessione a un server di test e tutto il resto viene gestito. Il ciclo principale è questo:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
Quando scrivo la mia domanda principale, sto cercando di indovinare questa soluzione non sarà accettabile (come sarebbe dovuto essere chiamato nel ciclo di messaggi che, pur possibile, avrebbe problemi quando la coda del messaggio blocca l'attesa di un messaggio. Potresti cambiarlo in modo che il ciclo del messaggio non blocchi, ma non è quello che bloccherà l'utilizzo della CPU attraverso il tetto?)
La soluzione sembra è di lanciarne un altro. Ok bene. Ma poi ho letto che restituisce io_service::run()
quando non c'è lavoro da fare. Cos'è quello? È che quando non ci sono dati o connessioni? Se esiste almeno una connessione, rimane in vita? Se è così, non è tanto un problema dato che devo solo avviare un nuovo thread quando viene effettuata la prima connessione e sono felice se tutto si interrompe quando non c'è niente da fare. Immagino di essere confuso dalla definizione di "niente lavoro da fare".
Quindi devo preoccuparmi di sincronizzare il mio boost con il thread principale della GUI. Quindi, suppongo che le mie domande siano:
- Qual è il modo migliore di utilizzare boost :: asio in un'applicazione client per quanto riguarda i thread e mantenerli in vita?
- Durante la scrittura su un socket dalla filettatura principale alla filettatura IO, la sincronizzazione è stata ottenuta utilizzando
boost::asio::post
, in modo che la chiamata si verifichi più tardi in io_service? - Quando i dati sono ricevuti, come fanno le persone a riportare i dati sul thread dell'interfaccia utente? In passato, quando usavo le porte di completamento, creavo un evento speciale che poteva postare i dati sul thread principale dell'interfaccia utente usando a :: SendMessage. Non era elegante, ma ha funzionato.
Oggi ne leggerò un po 'di più, ma sarebbe bello farsi notare da qualcuno che lo ha già fatto. La documentazione di Boost :: asio non è eccezionale, e la maggior parte del mio lavoro finora è stato basato su un po 'di documentazione, alcuni tentativi/errori, qualche codice di esempio sul web.
+1 io_service :: il lavoro è il modo in cui risolvo il problema da solo. –
grazie per la tua risposta. Quando dici che ci sono diverse possibilità, quali sono quelle che hai usato in passato? –
@ Moo-Juice, non mi trovavo in una situazione in cui c'era un thread specifico della GUI che doveva gestire i dati. Ho appena usato il meccanismo di callback e gestito i dati da un thread io_service come è arrivato.Qualche forma di coda messaggi che i thread gui leggono potrebbe essere usata per indicare l'arrivo di nuovi dati. O potresti semplicemente usare una variabile condizionale. In realtà dipende dall'applicazione, dal design e dai requisiti dell'utente. –