2013-09-09 4 views
2

Как может порождали подталкивание нитьподталкивания :: нить

boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar)); 

прибудет взаимодействие UI? Я пробовал переходить в битвар, но он не отвечает.

+1

Если 'boost :: thread' действует как' std :: thread', здесь не нужно 'bind'. –

+0

Для std :: thread Я нашел http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-3.html. Я попытался передать ссылку, но это не сработало с повышением - действительно ли это возможно? – user2763108

+0

Вы можете использовать Boost.Asio 'io_service' (http://stackoverflow.com/questions/17311512/howto-post-messages-between-threads-with-boostasio) –

ответ

0

В общем, пользовательский интерфейс должен полностью работать на основной теме. (Вы не указываете, какую библиотеку или платформу пользовательского интерфейса вы используете, но это касается практически всех основных графических интерфейсов). Таким образом, созданные вами потоки (с использованием Boost или иначе) не могут напрямую взаимодействовать с графическим интерфейсом.

Вместо этого вы должны использовать некоторую форму связи, чтобы сигнализировать между вашим рабочим потоком и основным потоком графического интерфейса для взаимодействия. Должен ли он сигнализировать перерисовку экрана, обновлять индикатор выполнения, изменять текстовое поле или включать кнопку - все взаимодействие с графическим интерфейсом должно происходить в основном потоке.

Простой способ начать работу с вашим графическим интерфейсом для создания рабочего потока и периодического опроса его по таймеру для обновления статуса (путем вызова соответствующих методов get объекта, поддерживающего состояние потока). Рабочий поток тогда просто нуждается в атомарном обновлении своего состояния (т. Е. С использованием мьютекса), чтобы его можно было запросить, а затем ему не нужно знать о графическом интерфейсе.

boolvar, который вы передадите, будет просто принят как параметр MyThreadFunc. Внутри этого рабочего потока вам нужно будет предоставить цикл обработки или дождаться некоторого сигнала, иначе он будет завершен, как любая другая функция, и немедленно вернется. Если вы ставите printf или регистрируете вызов в начале и конце вашей функции потока, вам лучше увидеть, что происходит.

Эта тема, очевидно, довольно сложная! Нам потребуется дополнительная информация, чтобы предоставить более конкретные рекомендации.

+0

Спасибо. Получение информации из потока удобно выполняется с помощью обратного вызова. Но почему нет простого способа получить его? – user2763108

+0

Обычно вы инициализируете поток всей информацией, необходимой для выполнения своей работы. Это можно сделать либо в конструкторе объекта, который работает в потоке (до его появления), либо передавая данные функции потока, когда вы на самом деле создаете его. Это непросто? Если вам нужно передать данные за время жизни потока, вы можете использовать очередь или аналогичную структуру. – gavinb

0

Ответ использовать импульс: исх или станд :: исх так:

повышение :: нити т (повышение :: Bind (& PMyClass :: MyThreadfunc, это, обратный вызов, повышение :: реф (boolvar)));

0

Я предполагаю, что вы используете Windows, хотя другие пользовательские интерфейсы похожи.

Вы должны использовать функцию обратного вызова, чтобы обновить некоторую структуру, составленную в вашем основном классе View, но убедитесь, что она защищена мьютезом, когда вы это делаете. Затем используйте PostMessage(), чтобы сообщить мэйнфрейму, что состояние этой переменной изменилось, напишите обработчик этого сообщения в основном потоке пользовательского интерфейса, чтобы затем прочитать значение и соответствующим образом обновить элемент управления.

Смежные вопросы