Summer of Code 2006
今年もやるそうで。Monoも参加します。去年は16件中11〜13件が成功事例としてカウントされたので、期待したいところです。
プロジェクトの候補リストはコチラ。でも、独自のクールなアイディアがある人は、その方がいいでしょう。
僕も1つだけ追加してみました。
しかしいくら何でもMonoDevelopにassembly browserを付けるだけみたいなのはSoC以外でやってほしいなあ。type-reflectorをちょこっといじってAdd-inにするだけなんじゃないかと思うんだけど。
BackgroundWorker
マルチスレッドプログラミングに特に深い造詣があるわけでもない僕が実装してみますよ。おーこわ。
小ネタその1。RunWorkerCompletedEventArgs.UserState
public RunWorkerCompletedEventArgs (
object result, Exception error, bool cancelled)
doh.
どうやってもUserStateは渡せません。
ちなみに既知らしい。
その2。.NET 2.0ではWindows FormsのBeginInvoke()まわりが厳しくなっていると聞く。全く試したことがないのでやってみた:
using System;
using System.Threading;
using System.Windows.Forms;
public class TestForm : Form
{
public static void Main ()
{
Application.Run (new TestForm ());
}
Label label = new Label ();
Thread t;
public TestForm ()
{
t = Thread.CurrentThread;
Button button = new Button ();
button.Top = 100;
this.Controls.Add (label);
this.Controls.Add (button);
button.Click += delegate (object o, EventArgs e) {
new Thread (new ThreadStart (delegate () {
DoPrintLabel ();
})).Start ();
};
}
void DoPrintLabel ()
{
Console.WriteLine (Thread.CurrentThread == t);
label.Text += ”_ ”;
}
}例外、投げられません…そういう話じゃないの??
その3。monoのSynchronizationContext.Post:
public virtual void Post (SendOrPostCallback d, object state)
{
d.BeginInvoke (state, null, null);
}
ひえぇ…全然contextがSynchronizedじゃないよコレ。でもランタイムのちょっとした部分に踏み込まないと実装できなさげなので(w とりあえず報告して様子見ということにするのだ。
System.Windows.Forms.Control.BeginInvoke()の実装が使い回せるかと思ったんだけど、どうやらプラットフォーム依存コードになっていて、XplatUIX11だと非同期のままで実行しているようだ。1
コメント
NyaRuRu — 04/17/2006 21:27:38
例外、投げられません…そういう話じゃないの??
Visual C# 2005 ですが、デバッグ実行すると Control.CheckForIllegalCrossThreadCalls がデフォルトで true になるようですね。
atsushieno — 04/18/2006 08:22:34
ぉぉ、そこでチェックが切り替えられたのですね。見事に例外が投げられるようになりました。ありがとうございます。
ていうかコレはmonoにもほしいなあ。MWFチームがいっぱいいっぱいでなければお願いするところなんだけど…
atsushieno — 04/18/2006 09:02:02
よく見たら実装されていた。てことで今デバッグして直してもらっちゃいました :-)
Footnotes
-
ちなみにXplatUIOSXではNotImplementedException(w ↩