Ну, технически любой такой объект завершит то, чтобы быть созданным по библиотеке потока C-стиля, потому что C++ только что определил запас std::thread
модель в C++ 0x, который был просто закреплен и еще не был реализован. Проблема является несколько системной, технически существующая модель памяти C++ не достаточно строга для обеспечения четко определенной семантики для всего из, 'происходит перед' случаи. Hans Boehm написал работу по теме некоторое время назад и способствовал выработке C++ 0x стандарт по теме.
http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
, Который сказал, существует несколько межплатформенных библиотек C++ потока, которые работают просто великолепно на практике. Стандартные блоки потока Intel содержат tbb:: распараллельте возражают, что тесно приближает C++ 0x стандарт, и Повышение имеет повышение:: библиотека потока, которая делает то же.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Используя повышение:: поток Вы получили бы что-то как:
#include
void task1() {
// do stuff
}
void task2() {
// do stuff
}
int main (int argc, char ** argv) {
using namespace boost;
thread thread_1 = thread(task1);
thread thread_2 = thread(task2);
// do other stuff
thread_2.join();
thread_1.join();
return 0;
}
Как вы заметили, класс RoutedCommand
является реализацией интерфейса ICommand
, его основное отличие, если это его функция, аналогична функции RoutedEvent
:
Методы Execute и CanExecute в RoutedCommand не содержат логики приложения для команды, как в случае с типичной ICommand, а скорее, эти методы вызывают события, которые проходят по дереву элементов в поисках объекта с CommandBinding. Обработчики событий, прикрепленные к CommandBinding, содержат логику команды.
Метод Execute вызывает события PreviewExecuted и Executed. Метод CanExecute вызывает события PreviewCanExecute и CanExecute.
В случае, когда вы не хотите, чтобы поведение RoutedCommand
вы ' Я рассмотрю вашу собственную реализацию ICommand
. Что касается паттерна MVVM, я не могу сказать одно решение, похоже, что у каждого своя методология. Однако вот несколько подходов к этой проблеме, с которыми я столкнулся:
Как насчет чего-то вроде этого:
Большинство реализаций MVVM, с которыми я сталкивался, пытаются использовать привязку к ViewModel, и, таким образом, ViewModel (а не View) владеет логикой CanExecute / Execute.
В отличие от этого, обработчики событий переносят это бремя на View. Затем обработка может быть распространена на ViewModel, но это означает немного более высокую степень связи между ViewModel и View (приведение + вызов метода и т. Д.).
Большинство реализаций MVVM, с которыми я сталкивался, пытаются использовать привязку к ViewModel, и, таким образом, ViewModel (а не View) владеет логикой CanExecute / Execute.
В отличие от этого, обработчики событий переносят это бремя на View. Затем обработка может быть распространена на ViewModel, но это означает немного более высокую степень связи между ViewModel и View (приведение + вызов метода и т. Д.).