<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++/CLI</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/category/417.aspx</link><description>C++/CLI</description><managingEditor>επιστημη</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>επιστημη</dc:creator><title>Visual Studio 2012　のほんのりトホホなとこ。</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/11/13/300636.aspx</link><pubDate>Tue, 13 Nov 2012 19:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/11/13/300636.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/300636.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/11/13/300636.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/300636.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/300636.aspx</trackback:ping><description>&lt;p&gt;
&lt;img src="http://www1.c3-net.ne.jp/episteme/images/vs2012cpp.png"&gt;
&lt;br&gt;&lt;br&gt;ホントだー、C++/CLIで Windows-Form アプリが&lt;strong&gt;つくれなく&lt;/strong&gt;なってるー。&lt;br&gt;要らんっちゃー要らんけども、消えちゃうのは&lt;strong&gt;さみしぃ&lt;/strong&gt;わぁ。&lt;br&gt;あたしゃC#もボチボチ触るから お絵描きはC#・ナカミはC++・仲介役にC++/CLI&lt;br&gt;てゆー選択すんだけども、確かに&lt;strong&gt;めんどっちー&lt;/strong&gt;のねー...&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/300636.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Visual Studio 11 から本気出す! WPF with C++/CLI</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/04/28/268916.aspx</link><pubDate>Sat, 28 Apr 2012 23:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/04/28/268916.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/268916.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/04/28/268916.aspx#Feedback</comments><slash:comments>507</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/268916.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/268916.aspx</trackback:ping><description>&lt;p&gt;&lt;iframe style="width: 120px; height: 240px;" marginHeight="0" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=episteme00-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=4774150169" frameBorder="0" marginWidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br&gt;&lt;br&gt;レビューやらせていただきましたよ。&lt;br&gt;んで、せっかくだから「&lt;strong&gt;周回遅れ&lt;/strong&gt;にもほどがあんぞｦｲ」なWPFに手を付けます。&lt;br&gt;いやね、Visual Studio 11でよぅやっとC++/CLIのインテリセンスが復活してくれたんで、&lt;br&gt;ﾏﾝﾄﾞｸｾｰことやる気になったっちゅーのが本音。&lt;br&gt;てかさ、WPFアプリケーションてばC++の&lt;strong&gt;出番ナシ&lt;/strong&gt;なのが癪に障るんで、&lt;br&gt;ひな形生成だけをC#にやらせ、残りは&lt;strong&gt;ぜーんぶC++/CLI&lt;/strong&gt;で書いてみるココロミ。&lt;br&gt;&lt;br&gt;おためしにこしらえたのは毎度毎度のカウンター。&lt;br&gt;「3.2.3 視覚的デザインツールの利用」にあったMVVMをほとんどそのまま&lt;strong&gt;パクらせてもらい&lt;/strong&gt;ました。&lt;br&gt;
&lt;img src="http://www1.c3-net.ne.jp/episteme/images/WPF_cpp.png"&gt;&lt;div class="code"&gt;&lt;pre&gt;&amp;lt;Window x:Class="DataBindingSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="データ バインディング サンプル" Width="193" SizeToContent="Height" Height="157"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;TextBox Text="&lt;font color="#ff0000"&gt;{Binding Count}&lt;/font&gt;" FontSize="36" FontWeight="Bold" TextAlignment="Center" /&amp;gt;
        &amp;lt;Button Content="+" Command="&lt;font color="#ff0000"&gt;{Binding IncCommand}&lt;/font&gt;" /&amp;gt;
        &amp;lt;Button Content="-" Command="&lt;font color="#ff0000"&gt;{Binding DecCommand}&lt;/font&gt;" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;XAMLはこんな↑カンジね、表示とボタンをそれぞれ CountとIncCommand/DecCommandにバインドしてます。&lt;br&gt;以降C#からはしばらくオサラバ、C++/CLIでCLRクラスライブラリを用意して参照させます。&lt;br&gt;ViewModel がコレ↓&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;#ifndef&lt;/font&gt; MAINWINDOWVIEWMODEL_H__
&lt;font color="blue"&gt;#define&lt;/font&gt; MAINWINDOWVIEWMODEL_H__

&lt;font color="blue"&gt;namespace&lt;/font&gt; DataBindingSample {

  &lt;font color="blue"&gt;public&lt;/font&gt; ref &lt;font color="blue"&gt;class&lt;/font&gt; &lt;strong&gt;MainWindowViewModel&lt;/strong&gt; : &lt;font color="blue"&gt;public&lt;/font&gt; System::ComponentModel::INotifyPropertyChanged {
  &lt;font color="blue"&gt;public&lt;/font&gt;:
    property &lt;font color="blue"&gt;int&lt;/font&gt; &lt;strong&gt;&lt;font color="#ff0000"&gt;Count&lt;/font&gt;&lt;/strong&gt; {
      &lt;font color="blue"&gt;int&lt;/font&gt; get();
      &lt;font color="blue"&gt;void&lt;/font&gt; set(&lt;font color="blue"&gt;int&lt;/font&gt; value);
    }

    &lt;font color="blue"&gt;virtual&lt;/font&gt; event System::ComponentModel::PropertyChangedEventHandler^ PropertyChanged;

    &lt;font color="blue"&gt;void&lt;/font&gt; &lt;strong&gt;&lt;font color="#ff0000"&gt;attachCommand&lt;/font&gt;&lt;/strong&gt;(System::Action&amp;lt;Object^&amp;gt;^ inc, System::Action&amp;lt;Object^&amp;gt;^ dec);
    &lt;font color="blue"&gt;void&lt;/font&gt; &lt;strong&gt;&lt;font color="#ff0000"&gt;Update&lt;/font&gt;&lt;/strong&gt;(&lt;font color="blue"&gt;int&lt;/font&gt; count);

    property System::Windows::Input::ICommand^ &lt;font color="#ff0000"&gt;&lt;strong&gt;IncCommand&lt;/strong&gt;&lt;/font&gt; 
      { System::Windows::Input::ICommand^ get(); }
    property System::Windows::Input::ICommand^ &lt;strong&gt;&lt;font color="#ff0000"&gt;DecCommand&lt;/font&gt;&lt;/strong&gt; 
      { System::Windows::Input::ICommand^ get(); }

  &lt;font color="blue"&gt;private&lt;/font&gt;:
    &lt;font color="blue"&gt;int&lt;/font&gt; _Count;
    System::Windows::Input::ICommand^ incCommand;
    System::Windows::Input::ICommand^ decCommand;
  };
 
}

&lt;font color="blue"&gt;#endif&lt;/font&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;attachCommandでView(のIncCommand/DecCommand)からModelに、&lt;br&gt;UpdateでModel（のカウント値変更)をViewに飛ばします。&lt;br&gt;&lt;br&gt;カウンタ本体:Counter と ViewModelに接続するための CounterModel はそれぞれ:
&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;#ifndef&lt;/font&gt; COUNTER_H__
&lt;font color="blue"&gt;#define&lt;/font&gt; COUNTER_H__

&lt;font color="blue"&gt;namespace&lt;/font&gt; DataBindingSample {

  &lt;font color="blue"&gt;public&lt;/font&gt; ref &lt;font color="blue"&gt;class&lt;/font&gt; &lt;strong&gt;Counter&lt;/strong&gt; {
  &lt;font color="blue"&gt;public&lt;/font&gt;:
    &lt;font color="blue"&gt;void&lt;/font&gt; inc();
    &lt;font color="blue"&gt;void&lt;/font&gt; dec();
    &lt;font color="blue"&gt;int&lt;/font&gt; count();

  &lt;font color="blue"&gt;private&lt;/font&gt;:
    &lt;font color="blue"&gt;int&lt;/font&gt; count_;
  };

  &lt;font color="blue"&gt;public&lt;/font&gt; ref &lt;font color="blue"&gt;class&lt;/font&gt; &lt;strong&gt;CounterModel&lt;/strong&gt; : Counter {
  &lt;font color="blue"&gt;public&lt;/font&gt;:

    &lt;font color="green"&gt;// Model→ViewModel&lt;/font&gt;
    event System::Action&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;&amp;gt;^ &lt;strong&gt;&lt;font color="#ff0000"&gt;CountUpdatedHandler&lt;/font&gt;&lt;/strong&gt;;

    &lt;font color="green"&gt;// ViewModel→Model &lt;/font&gt;
    property System::Action&amp;lt;Object^&amp;gt;^ &lt;font color="#ff0000"&gt;&lt;strong&gt;Increment&lt;/strong&gt;&lt;/font&gt; { System::Action&amp;lt;Object^&amp;gt;^ get(); }
    property System::Action&amp;lt;Object^&amp;gt;^ &lt;font color="#ff0000"&gt;&lt;strong&gt;Decrement&lt;/strong&gt;&lt;/font&gt; { System::Action&amp;lt;Object^&amp;gt;^ get(); }

  &lt;font color="blue"&gt;private&lt;/font&gt;:

    &lt;font color="blue"&gt;void&lt;/font&gt; Notify();

    &lt;font color="blue"&gt;void&lt;/font&gt; inc(Object^ dummy);
    &lt;font color="blue"&gt;void&lt;/font&gt; dec(Object^ dummy);

  };

}

&lt;font color="blue"&gt;#endif&lt;/font&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CountUpdateHandlerとIncrement/Decrement がViewModelとの接続ポートになってます。&lt;br&gt;&lt;br&gt;んでもって MainWindow, MainWindowViewModel, CounterModel を&lt;strong&gt;がしゃがしゃ繋ぐ&lt;/strong&gt;トコ&lt;br&gt;をC#側にねじ込みます。 MainWindowViewModel と CounterModel は App のstaticメンバ&lt;br&gt;にしちゃいました。
&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="green"&gt;/* 
 * App.xaml.cs
 */&lt;/font&gt;
&lt;font color="blue"&gt;using&lt;/font&gt; System.Windows;

&lt;font color="blue"&gt;namespace&lt;/font&gt; DataBindingSample {

  &lt;font color="blue"&gt;public&lt;/font&gt; partial &lt;font color="blue"&gt;class&lt;/font&gt; App : Application {

    &lt;font color="blue"&gt;public&lt;/font&gt; &lt;font color="blue"&gt;static&lt;/font&gt; MainWindowViewModel &lt;strong&gt;&lt;font color="#ff0000"&gt;ViewModel&lt;/font&gt;&lt;/strong&gt; {
      get { 
        &lt;font color="blue"&gt;if&lt;/font&gt; ( viewmodel_ == null )
          viewmodel_ = &lt;font color="blue"&gt;new&lt;/font&gt; MainWindowViewModel();
        &lt;font color="blue"&gt;return&lt;/font&gt; viewmodel_;
      }
    }

    &lt;font color="blue"&gt;public&lt;/font&gt; &lt;font color="blue"&gt;static&lt;/font&gt; CounterModel &lt;strong&gt;&lt;font color="#ff0000"&gt;Model&lt;/font&gt;&lt;/strong&gt; {
      get {
        &lt;font color="blue"&gt;if&lt;/font&gt; ( model_ == null )
          model_ = &lt;font color="blue"&gt;new&lt;/font&gt; CounterModel();
        &lt;font color="blue"&gt;return&lt;/font&gt; model_;
      }
    }

    &lt;font color="blue"&gt;public&lt;/font&gt; &lt;font color="blue"&gt;static&lt;/font&gt; MainWindowViewModel viewmodel_;
    &lt;font color="blue"&gt;public&lt;/font&gt; &lt;font color="blue"&gt;static&lt;/font&gt; CounterModel model_;
  }

}

&lt;font color="green"&gt;/*
 * MainWindow.xaml.cs
 */&lt;/font&gt;
&lt;font color="blue"&gt;using&lt;/font&gt; System.Windows;

&lt;font color="blue"&gt;namespace&lt;/font&gt; DataBindingSample {

  &lt;font color="blue"&gt;public&lt;/font&gt; partial &lt;font color="blue"&gt;class&lt;/font&gt; MainWindow : Window {
    &lt;font color="blue"&gt;public&lt;/font&gt; MainWindow() {
      InitializeComponent();
&lt;strong&gt;      &lt;font color="blue"&gt;this&lt;/font&gt;.DataContext = App.ViewModel;
      App.ViewModel.attachCommand(App.Model.Increment, App.Model.Decrement);
      App.Model.CountUpdatedHandler += App.ViewModel.Update;
&lt;/strong&gt;    }
  }

}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C++/CLI側の実装(.cpp)は割愛。ソリューションまるごとうｐするから読んでやって。&lt;br&gt;
&lt;iframe height="120" src="https://skydrive.live.com/embed?cid=07C558F8E11E708F&amp;amp;resid=7C558F8E11E708F%21773&amp;amp;authkey=AP1tEpI6gEkyPmk" frameBorder="0" width="98" scrolling="no"&gt;&lt;/iframe&gt;&lt;br&gt;白状すればMVVMってハジメテなの。おもきし&lt;strong&gt;我流&lt;/strong&gt;だし。ｶﾞｽｶﾞｽ突っ込んでやってくだせ。&lt;br&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/268916.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>stateless lambda (そのさん)</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/03/27/262664.aspx</link><pubDate>Tue, 27 Mar 2012 22:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/03/27/262664.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/262664.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2012/03/27/262664.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/262664.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/262664.aspx</trackback:ping><description>&lt;p&gt;stateless lambda は関数ポインタに暗黙変換できるっちゅーんだから、&lt;br&gt;delegateだって作れるはずよね...&lt;/p&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;iostream&amp;gt;

&lt;font color="blue"&gt;using&lt;/font&gt; &lt;font color="blue"&gt;namespace&lt;/font&gt; System;
&lt;font color="blue"&gt;using&lt;/font&gt; &lt;font color="blue"&gt;namespace&lt;/font&gt; std;

&lt;font color="blue"&gt;public&lt;/font&gt; ref &lt;font color="blue"&gt;class&lt;/font&gt; Counter {
&lt;font color="blue"&gt;public&lt;/font&gt;:
  delegate &lt;font color="blue"&gt;void&lt;/font&gt; OnUpdate(Counter^ counter);
  Counter() : value_(0) {}
  &lt;font color="blue"&gt;void&lt;/font&gt; incr() { ++value_; handler(&lt;font color="blue"&gt;this&lt;/font&gt;); }
  property &lt;font color="blue"&gt;int&lt;/font&gt; count { &lt;font color="blue"&gt;int&lt;/font&gt; get() { &lt;font color="blue"&gt;return&lt;/font&gt; value_; }}
  event OnUpdate^ handler;
&lt;font color="blue"&gt;private&lt;/font&gt;:
  &lt;font color="blue"&gt;int&lt;/font&gt; value_;
};

&lt;font color="blue"&gt;void&lt;/font&gt; print_fun(Counter^ counter) {
  cout &amp;lt;&amp;lt; counter-&amp;gt;count &amp;lt;&amp;lt; endl;
}

&lt;font color="blue"&gt;int&lt;/font&gt; main() {
  Counter^ counter = gcnew Counter();
  &lt;font color="blue"&gt;auto&lt;/font&gt; print_lambda = [](Counter^ counter) { cout &amp;lt;&amp;lt; counter-&amp;gt;count &amp;lt;&amp;lt; endl; };
  counter-&amp;gt;handler += gcnew Counter::OnUpdate(print_fun);    &lt;font color="green"&gt;// OK&lt;/font&gt;
  counter-&amp;gt;handler += gcnew Counter::OnUpdate(print_lambda); &lt;font color="green"&gt;// error&lt;/font&gt;
  counter-&amp;gt;incr();

  &lt;font color="blue"&gt;return&lt;/font&gt; 0;
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;...ダメでした orz&lt;br&gt;くやしいので&lt;a href="https://connect.microsoft.com/VisualStudioJapan/feedback/details/733612/stateless-lambda-delegate-construct"&gt;Connectにfeedback&lt;/a&gt;したです。　voteしてくれさい。&lt;br&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/262664.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Visual Studio 11 Developer Preview</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/09/15/202778.aspx</link><pubDate>Thu, 15 Sep 2011 21:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/09/15/202778.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/202778.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2011/09/15/202778.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/202778.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/202778.aspx</trackback:ping><description>&lt;p&gt;MSDNに上がってたわけよ、&lt;strong&gt;次期Visual Studio &lt;/strong&gt;がっ&lt;br&gt;&lt;br&gt;リリースノートによれば現VS2010と同居できるけど、un-install時に&lt;strong&gt;悪さをしかねん&lt;/strong&gt;らしく、&lt;br&gt;大事をとってVirtualPC上にWin7起こしてそん中でインスコしてみたです。&lt;br&gt;# 対応OSにXP/Vistaが入ってなかったですよ。&lt;br&gt;&lt;/p&gt;
&lt;img src="http://episteme.wankuma.com/image/vs11devprev.png"&gt;
&lt;p&gt;おや、Visual Studio 2011 じゃないのね。&lt;br&gt;んなこたどーでもよくて、C++/CLIに&lt;strong&gt;インテリセンス復活&lt;/strong&gt;ですよきゃっほーい♪&lt;br&gt;&lt;/p&gt;
&lt;img src="http://episteme.wankuma.com/image/intellisense.png"&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/202778.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>たまにはMVPらしいこと書いてみるテスト</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/11/28/195339.aspx</link><pubDate>Sun, 28 Nov 2010 03:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/11/28/195339.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/195339.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2010/11/28/195339.aspx#Feedback</comments><slash:comments>231</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/195339.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/195339.aspx</trackback:ping><description>&lt;P&gt;blogの更新がとんとご無沙汰してます。すんませんねー&lt;BR&gt;なんかもー、本業でわたわたしてまして、おうち帰ると&lt;STRONG&gt;メシ食ってばたんきゅ&lt;/STRONG&gt;、な日が続いてますのん。&lt;BR&gt;わんくま東京勉強会も顔ださなくなっちゃいました。もーちょいで&lt;STRONG&gt;楽になる&lt;/STRONG&gt;ハズなんですけども。&lt;BR&gt;&lt;BR&gt;先日&lt;STRONG&gt;MVP Open Day&lt;/STRONG&gt;にお邪魔しました。百名を超えるMVPのみなさんが顔を合わせ、新人MVP&lt;STRONG&gt;をいぢくり回す&lt;/STRONG&gt;会ですわ(ﾎﾎﾎ&lt;BR&gt;久しぶりにMVPのみなさんと顔をあわせ、ちょっとだけ&lt;STRONG&gt;元気をもらえた&lt;/STRONG&gt;ように思います。ありがとでした。&lt;/P&gt;&lt;P&gt;ちょっとだけ元気もらった勢いでVC++10のlambdaの&lt;STRONG&gt;カラクリ&lt;/STRONG&gt;を推測するｺｺﾛﾐなど。&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;#include &amp;lt;iostream&amp;gt;&lt;BR&gt;#include &amp;lt;typeinfo&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;int main() {&lt;BR&gt;&amp;nbsp; int n;&lt;BR&gt;&amp;nbsp; auto lambda = [=](void* p) { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout &amp;lt;&amp;lt; p &amp;lt;&amp;lt; '\t' &amp;lt;&amp;lt; (void*)&amp;amp;n &amp;lt;&amp;lt; std::endl; &lt;BR&gt;&amp;nbsp; };&lt;BR&gt;&amp;nbsp; int m;&lt;BR&gt;&amp;nbsp; lambda(&amp;amp;n);&lt;BR&gt;&amp;nbsp; lambda(&amp;amp;lambda);&lt;BR&gt;&amp;nbsp; lambda(&amp;amp;m);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; typeid(lambda).name() &amp;lt;&amp;lt; std::endl;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;こいつをコンパイル/実行すると&lt;BR&gt;&lt;FONT face="Courier New"&gt;0028FDFC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0028FE00&lt;BR&gt;0028FE00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0028FE00&lt;BR&gt;0028FDF8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0028FE00&lt;BR&gt;class `anonymous namespace'::&amp;lt;lambda0&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;興味深い結果が得られました。どうやらメモリ上には:&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;0028FDF8&lt;/FONT&gt;: m&lt;BR&gt;&lt;FONT face="Courier New"&gt;0028FDFC&lt;/FONT&gt;: n&lt;BR&gt;&lt;FONT face="Courier New"&gt;0028FE00&lt;/FONT&gt;: lambda と lambda内のn&lt;/P&gt;&lt;P&gt;なんてなレイアウトでローカル変数が作られた様子。&lt;BR&gt;n と lambda内のn とが異なる位置にあります。この二つは&lt;STRONG&gt;別物&lt;/STRONG&gt;として扱われてるてことね。&lt;BR&gt;値キャプチャされたnはlambda内で書き換えられないからくりがココにあるみたい。&lt;BR&gt;また、lambdaとlambda内のnとが同じ位置にあること、lambdaの型がclassであることからしてlambda内のnはclassの&lt;STRONG&gt;最初のメンバ&lt;/STRONG&gt;となってるポ。&lt;/P&gt;&lt;P&gt;してみるとコンパイラ君、おそらくはこんなコードを内部的に生成するのでしょう:&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;namespace {&lt;BR&gt;&lt;FONT color="#0000ff"&gt;&amp;nbsp; class lambda0 {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n_; // 値キャプチャしたn&lt;BR&gt;&amp;nbsp; public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lambda0(int captured_var) : n_(captured_var) {}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator()(void* p) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout &amp;lt;&amp;lt; p &amp;lt;&amp;lt; '\t' &amp;lt;&amp;lt; (void*)&amp;amp;n_ &amp;lt;&amp;lt; std::endl; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;int main() {&lt;BR&gt;&amp;nbsp; int m;&lt;BR&gt;&amp;nbsp; int n;&lt;BR&gt;&amp;nbsp; &lt;FONT color="#0000ff"&gt;lambda0 lambda(n);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; lambda(&amp;amp;n);&lt;BR&gt;&amp;nbsp; lambda(&amp;amp;lambda);&lt;BR&gt;&amp;nbsp; lambda(&amp;amp;m);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; typeid(lambda).name() &amp;lt;&amp;lt; std::endl;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;lambda式を定義するたんびにnanonymousな名前空間に&lt;STRONG&gt;ｺｿｰﾘ&lt;/STRONG&gt;classを生成するのであれば、&lt;BR&gt;C++/CLIでmanagedな変数をキャプチャできないことが&lt;STRONG&gt;説明つく&lt;/STRONG&gt;です。class内にはmanagedは置けないもんね。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/195339.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>あと少し...だと思うんだけどねぇ</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/12/11/183732.aspx</link><pubDate>Fri, 11 Dec 2009 16:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/12/11/183732.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/183732.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/12/11/183732.aspx#Feedback</comments><slash:comments>1367</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/183732.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/183732.aspx</trackback:ping><description>&lt;P&gt;.NET Framework &lt;STRONG&gt;4.0&lt;/STRONG&gt; には &lt;STRONG&gt;TPL&lt;/STRONG&gt;(Task Parallel Library) ゆーのんが&lt;BR&gt;追加されてて、mscorelib に入ってるらしいから &lt;STRONG&gt;C++/CLI でも使えるはず&lt;/STRONG&gt;よね。&lt;/P&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;
&lt;FONT color=#000000&gt;&lt;B&gt;void&lt;/B&gt;&lt;/FONT&gt; print(&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; x) {
  System::Console::Write(L"{0} ",x);
}

&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; main() {
  System::Threading::Tasks::Parallel::&lt;FONT color=#000000&gt;&lt;B&gt;For&lt;/B&gt;&lt;/FONT&gt;(0,200,
    gcnew System::Action&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt;&amp;gt;(&amp;amp;print));
}

&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;おぉ、動く動く。けどね、できることなら Parallel.For の中に書き下したいわけよ。&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; Parallel::For(0, 200, &lt;FONT color=#ff0000&gt;[](int x) { System::Cosnole::Write(L"{0} ", x);}&lt;/FONT&gt;);&lt;/FONT&gt;&lt;BR&gt;みたいにさ。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;なんとかならんもんかのぉ...&lt;/STRONG&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/183732.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>こいつも動くぞ</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/11/04/182696.aspx</link><pubDate>Wed, 04 Nov 2009 09:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/11/04/182696.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/182696.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/11/04/182696.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/182696.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/182696.aspx</trackback:ping><description>&lt;P&gt;ネタ元 → &lt;A id=RecentPosts__ctl4_Hyperlink2 HREF="/rti/archive/2009/11/03/182671.aspx"&gt;こいつ動くぞ&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;わんくまで僕が最初にやったセッションのネタにカブり気味っす。&lt;/P&gt;
&lt;META name=generator content=src2html&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;
#include &amp;lt;iostream&amp;gt;
&lt;FONT color=#000000&gt;&lt;B&gt;&lt;BR&gt;template&lt;/B&gt;&lt;/FONT&gt;&amp;lt;&lt;FONT color=#000000&gt;&lt;B&gt;typename&lt;/B&gt;&lt;/FONT&gt; T&amp;gt;
&lt;FONT color=#000000&gt;&lt;B&gt;void&lt;/B&gt;&lt;/FONT&gt; print(T arg) {
#ifdef __cplusplus_cli
  System::Console::WriteLine(arg);
#&lt;FONT color=#000000&gt;&lt;B&gt;else&lt;/B&gt;&lt;/FONT&gt;
  std::cout &amp;lt;&amp;lt; arg &amp;lt;&amp;lt; std::endl;
#endif
}

&lt;FONT color=#000000&gt;&lt;B&gt;int&lt;/B&gt;&lt;/FONT&gt; main() {
  print("Hello" + 1);
}&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;これ、C++としてコンパイルしたときと&lt;BR&gt;C++/CLIとしてコンパイルしたときでは&lt;BR&gt;結果が異なるですよ。&lt;/P&gt;
&lt;P&gt;「C++とコンパチじゃねぇ!」ってんで&lt;BR&gt;C++/CLIがISO標準になれなかった一因でございます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/182696.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>C++/CLIでlambda</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/10/27/182479.aspx</link><pubDate>Tue, 27 Oct 2009 21:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/10/27/182479.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/182479.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/10/27/182479.aspx#Feedback</comments><slash:comments>2072</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/182479.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/182479.aspx</trackback:ping><description>&lt;p&gt;lambda式の引数に(マニュアルではできるってゆってるにもかかわらず) managed-object&lt;br&gt;が渡せないっちゅー不具合があったのですが、Visual Studio 2010β2 で解決した模様。&lt;br&gt;&lt;br&gt;これでC++/CLIでもlamdaが使えるようになったワケですが、&lt;br&gt;lambdaの重要な機能:キャプチャについては依然としてmanaged-object&lt;br&gt;をキャプチャできない。&lt;br&gt;&lt;br&gt;そこで、だ。maneged-objectはダメでもnativeならOKなわけで、&lt;br&gt;そんじゃってんでgcrootで managedにnativeのカワをかぶせてみた。&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre&gt;&lt;font color="#000000"&gt;
&lt;font color="#000077"&gt;// compile with: /clr&lt;/font&gt;
#include &amp;lt;msclr/gcroot.h&amp;gt;

&lt;font color="#000000"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; &lt;font color="#000000"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/font&gt; System;

&lt;font color="#000000"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; main()
{
    msclr::gcroot&amp;lt;String^&amp;gt; capture = L" be captured";
    String^ result = 
    [&amp;amp;] (String^ arg) -&amp;gt; String^
        { String^ tmp = arg + capture; capture = L"changed in lambda!"; &lt;font color="#000000"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; tmp; }("will");
    Console::WriteLine(L"result[{0}] capture[{1}]", result, capture);
}
&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;おー、でけたー。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/182479.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>生産者 と 消費者</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/09/16/181289.aspx</link><pubDate>Wed, 16 Sep 2009 10:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/09/16/181289.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/181289.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/09/16/181289.aspx#Feedback</comments><slash:comments>75</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/181289.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/181289.aspx</trackback:ping><description>&lt;P&gt;ネタ元 → &lt;A href="http://codezine.jp/article/detail/4372" jQuery1253060471893="39"&gt;並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」 &lt;/A&gt;&lt;/P&gt;
&lt;P&gt;# 記事の本筋とは離れるのでネタ元にコメントするのは差し控えるけども。&lt;BR&gt;このサンプル、ひとつの変数に複数のスレッドからアクセスするときの&lt;BR&gt;問題を示しているわけだが、いわゆる「生産者/消費者(producer/consumer)」の&lt;BR&gt;イディオムにはなってねぇ!&lt;BR&gt;&lt;BR&gt;生産者/消費者パターンちうのは:&lt;BR&gt;- 生産者は製品を製造し棚に並べる。棚が一杯なら空くまで待つ。&lt;BR&gt;- 消費者は製品を棚から取る。棚が空なら品出しを待つ。&lt;BR&gt;生産者スレッドの生産能力 と 消費者スレッドの購買能力 には&lt;BR&gt;バラつき/ムラがあり、そのバラつきを吸収するのが棚(在庫)なんだが、&lt;BR&gt;棚の容量には限りがあるのでたまにどちらかが待つことになります。&lt;BR&gt;&lt;BR&gt;MSDN漁ってみたらばまさにドンピシャなサンプルがありました。&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/yy12yx1f.aspx"&gt;方法 : producer スレッドと consumer スレッドを同期する (C# プログラミング ガイド)&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;ここんとこC++/CLIから離れてたのでリハビリがてらportしてみた。&lt;BR&gt;※ C++/CLI には lock 構文を持ち合わせてないんで、MonitorのEnter/Exitで代用&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;using namespace System;&lt;BR&gt;using namespace System::Threading;&lt;BR&gt;using namespace System::Collections::Generic;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#008000&gt;// 同期イベント: 「アイテムが追加された」と「終了しろ」&lt;BR&gt;&lt;/FONT&gt;public ref class SyncEvents {&lt;BR&gt;public: &lt;BR&gt;&amp;nbsp; SyncEvents() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventArray_&amp;nbsp;&amp;nbsp;&amp;nbsp; = gcnew array&amp;lt;EventWaitHandle^&amp;gt;(2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventArray_[0] = gcnew AutoResetEvent(false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventArray_[1] = gcnew ManualResetEvent(false);&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; property EventWaitHandle^ ExitThreadEvent &lt;FONT color=#008000&gt;// 「終了しろ」&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { EventWaitHandle^ get() { return eventArray_[1]; } }&lt;BR&gt;&amp;nbsp; property EventWaitHandle^ NewItemEvent &lt;FONT color=#008000&gt;// 「アイテムが追加された」&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { EventWaitHandle^ get() { return eventArray_[0]; } }&lt;BR&gt;&amp;nbsp; property array&amp;lt;EventWaitHandle^&amp;gt;^ EventArray &lt;FONT color=#008000&gt;// ふたつまとめて&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { array&amp;lt;EventWaitHandle^&amp;gt;^ get() { return eventArray_; } }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;private:&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;// eventArray_[0]:「アイテムが追加された」&lt;BR&gt;&amp;nbsp; // eventArray_[1]:「終了しろ」&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp; array&amp;lt;EventWaitHandle^&amp;gt;^ eventArray_;&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#0000ff&gt;/*&lt;BR&gt;&amp;nbsp;* 生産者&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;&lt;/FONT&gt;public ref class Producer&amp;nbsp; {&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Producer(Queue&amp;lt;int&amp;gt;^ q, SyncEvents^ e) : queue_(q), syncEvents_(e) {}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; &lt;FONT color=#008000&gt;// Producer.ThreadRun&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; void &lt;FONT color=#ff0000&gt;ThreadRun&lt;/FONT&gt;() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random r;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 「終了しろ」でない間、Queueにアイテムを追加する&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!syncEvents_-&amp;gt;ExitThreadEvent-&amp;gt;WaitOne(0, false)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object^ sync = ((System::Collections::ICollection^)queue_)-&amp;gt;SyncRoot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor::Enter(sync);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( queue_-&amp;gt;Count &amp;lt; 20 ) { &lt;FONT color=#008000&gt;// 倉庫に余裕がある間&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue_-&amp;gt;Enqueue(r.Next(0,100)); &lt;FONT color=#008000&gt;// アイテムを追加して&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; syncEvents_-&amp;gt;NewItemEvent-&amp;gt;Set(); &lt;FONT color=#008000&gt;// 「アイテムが追加された」イベント発行&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor::Exit(sync);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::WriteLine(L"Producer thread: produced {0} items", count);&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;private:&lt;BR&gt;&amp;nbsp; Queue&amp;lt;int&amp;gt;^ queue_;&lt;BR&gt;&amp;nbsp; SyncEvents^ syncEvents_;&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#0000ff&gt;/*&lt;BR&gt;&amp;nbsp;* 消費者&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;&lt;/FONT&gt;public ref class Consumer {&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Consumer(Queue&amp;lt;int&amp;gt;^ q, SyncEvents^ e) : queue_(q), syncEvents_(e) {}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; &lt;FONT color=#008000&gt;// Consumer.ThreadRun&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; void &lt;FONT color=#ff0000&gt;ThreadRun&lt;/FONT&gt;() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// イベント:「終了しろ」「アイテムが追加された」のいずれかを待ち、&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // そのイベントが「終了しろ」でない間&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (WaitHandle::WaitAny(syncEvents_-&amp;gt;EventArray) != 1) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object^ sync = ((System::Collections::ICollection^)queue_)-&amp;gt;SyncRoot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor::Enter(sync);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int item = queue_-&amp;gt;Dequeue(); &lt;FONT color=#008000&gt;// アイテムを取り出す&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor::Exit(sync);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::WriteLine(L"Consumer Thread: consumed {0} items", count);&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;private:&lt;BR&gt;&amp;nbsp; Queue&amp;lt;int&amp;gt;^ queue_;&lt;BR&gt;&amp;nbsp; SyncEvents^ syncEvents_;&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#0000ff&gt;/*&lt;BR&gt;&amp;nbsp;* 生産者/消費者を起こすメイン・スレッド&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;&lt;/FONT&gt;public ref class ThreadSyncSample {&lt;BR&gt;private:&lt;BR&gt;&amp;nbsp; &lt;FONT color=#008000&gt;// 在庫(Queue)の内容をダンプ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp; static void ShowQueueContents(Queue&amp;lt;int&amp;gt;^ q) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object^ sync = ((System::Collections::ICollection^)q)-&amp;gt;SyncRoot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor::Enter(sync);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for each (int item in q ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::Write(L"{0} ", item);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor::Exit(sync);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::WriteLine();&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;public:&lt;BR&gt;&amp;nbsp; static void Main() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Queue&amp;lt;int&amp;gt; queue = gcnew Queue&amp;lt;int&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SyncEvents syncEvents;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 生産者/消費者を生成し、それぞれのエントリでスレッドを用意&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::WriteLine(L"Configuring worker threads...");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Producer producer(%queue, %syncEvents);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Consumer consumer(%queue, %syncEvents);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread &lt;FONT color=#ff0000&gt;producerThread&lt;/FONT&gt;(gcnew ThreadStart(%producer, &amp;amp;Producer::ThreadRun));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread &lt;FONT color=#ff0000&gt;consumerThread&lt;/FONT&gt;(gcnew ThreadStart(%consumer, &amp;amp;Consumer::ThreadRun));&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 両スレッドを開始&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::WriteLine(L"Launching producer and consumer threads...");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;producerThread&lt;/FONT&gt;.Start();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;consumerThread&lt;/FONT&gt;.Start();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// たまにQueueをダンプ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=0; i&amp;lt;4; i++ ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread::Sleep(2500);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ShowQueueContents(%queue);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 「終了しろ」イベントを起こす&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console::WriteLine(L"Signaling threads to terminate...");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; syncEvents.ExitThreadEvent-&amp;gt;Set();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// 両スレッドの終了を待つ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;producerThread&lt;/FONT&gt;.Join();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;consumerThread&lt;/FONT&gt;.Join();&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int main() {&lt;BR&gt;&amp;nbsp; ThreadSyncSample::Main();&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;!----&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/181289.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>VS2010β : ラムダ式はmanagedでも使えんのけ?</title><link>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/06/29/176750.aspx</link><pubDate>Mon, 29 Jun 2009 15:59:00 GMT</pubDate><guid>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/06/29/176750.aspx</guid><wfw:comment>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/176750.aspx</wfw:comment><comments>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/archive/2009/06/29/176750.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/comments/commentRss/176750.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/services/trackbacks/176750.aspx</trackback:ping><description>&lt;P&gt;VS2010β のC++はラムダ式をサポートしてくれよるワケだが、&lt;BR&gt;&lt;STRONG&gt;ラムダ式はC++/CLIでも使えるんだろか&lt;/STRONG&gt;....やってみた。&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;#include &amp;lt;cliext/vector&amp;gt;&lt;BR&gt;#include &amp;lt;cliext/algorithm&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int main(){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cliext::vector&amp;lt;System::String^&amp;gt; v;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(L"ラム");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(L"ダっちゃ!");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cliext::for_each(v.begin(), v.end(), &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;[](System::String^ s) { System::Console::Write(s);}&lt;/FONT&gt;);&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;結果:&amp;nbsp;&lt;BR&gt;&amp;nbsp;error C3498: 's': you cannot capture a variable that has a managed type&lt;BR&gt;　→ managed型の変数を&lt;STRONG&gt;キャプチャすんなや&lt;/STRONG&gt;ｺﾞﾙｧ&lt;/P&gt;
&lt;P&gt;だそうです ヽ(`Д&amp;#180;)ﾉｳﾜｧｧｧﾝ&lt;BR&gt;目下のところ、ラムダ&lt;STRONG&gt;諦めて&lt;/STRONG&gt;↓こーするっきゃなさげ。&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=2 face="Courier New"&gt;namespace {&lt;BR&gt;&amp;nbsp; struct print {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator()(System::String^ s) const {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System::Console::Write(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; };&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int main(){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cliext::vector&amp;lt;System::String^&amp;gt; v;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(L"ラム");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(L"ダっちゃ!");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cliext::for_each(v.begin(), v.end(), &lt;FONT color=#0000ff&gt;print()&lt;/FONT&gt;);&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;System::Int32とか、C++native型と&lt;STRONG&gt;コンパチならば&lt;/STRONG&gt;許してくれるみたいですが...&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;int main(){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cliext::vector&amp;lt;System::Int32&amp;gt; v;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(123);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(456);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cliext::for_each(v.begin(), v.end(), &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;[](System::Int32 n) { System::Console::Write(n);}&lt;/FONT&gt;);&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;しょぼーん (&lt;/STRONG&gt;&amp;#180;・ω・)&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ｅｐｉｓｔｅｍｅ/aggbug/176750.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>