Это в некоторой степени связано с этим вопросом , но я думаю, мне нужно знать немного больше. Я пытался понять, как это сделать в течение нескольких дней (работая над другими частями), но для меня настало время укусить пулю и стать многопоточным. Кроме того, мне нужно немного больше информации, чем связанный с вопросом
Во-первых, о многопоточности. Поскольку я тестировал свой код, я не беспокоился о многопоточности. Это' s просто консольное приложение, которое запускает соединение с тестовым сервером, а затем обрабатывается все остальное. Основной цикл следующий:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
Когда я пишу свое основное приложение, я предполагаю, что это решение будет неприемлемым (так как его придется вызывать в цикле сообщений, который, хотя и возможно, будет иметь проблемы, когда сообщение очереди блоков, ожидающих сообщения. Вы можете изменить это так, чтобы цикл сообщений не блокировался, но разве это не сильно сократит использование ЦП?)
Решение, кажется, состоит в том, чтобы бросить еще один нить на нем. В порядке прекрасно. Но потом я прочитал, что io_service :: run ()
возвращается, когда нет работы. Это что? Это когда нет данных или нет подключений? Если хотя бы одно соединение существует, остается ли оно в живых? Если так, то это ' Это не такая большая проблема, поскольку мне нужно только запустить новый поток при первом подключении, и я буду счастлив, если все это остановится, когда вообще ничего не происходит. Думаю, меня смущает определение «работы не надо делать».
Тогда мне нужно беспокоиться о синхронизации моего потока ускорения с моим основным потоком графического интерфейса. Итак, я предполагаю, что у меня следующие вопросы:
boost :: asio :: post
, чтобы вызов происходил позже в io_service? Я буду читать еще кое-что сегодня, но было бы здорово получить предупреждение от того, кто это уже сделал. Документация Boost :: asio невелика, и большая часть моей работы до сих пор была основана на небольшом количестве документации, некоторых методах проб / ошибок, некоторых примерах кода в Интернете.