DoboWiki
Top
> .NETプログラミング研究/25 をテンプレートにして作成
.NETプログラミング研究/25 をテンプレートにして作成
開始行:
#title(.NETプログラミング研究 第25号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第25号 [#a503a075]
**.NET Tips [#pc3e9439]
**.NETのマルチスレッドプログラミング その7 [#vdc5818c]
#column(注意){{
この記事の最新版は「[[.NETのマルチスレッドプログラミング>...
}}
***別スレッドからフォーム、コントロールを扱う [#yf546e81]
マルチスレッドプログラミングで注意すべき様々な問題につい...
というのは、コントロール(フォームも含む)のメソッドは、...
-[[マルチスレッド Windows フォーム コントロールのサンプル...
(注1:ただし、Invoke、BeginInvoke、EndInvoke、CreateGrap...
まずはInvokeメソッドの使用法を説明します。Invokeメソッド...
+コントロールのメソッドを呼び出すためのメソッドを作成する。
+そのメソッドに合ったデリゲートを宣言する。
+コントロール(あるいはコントロールの親フォーム)のInvoke...
といったようになります。
次にInvokeメソッドを使った具体例を示します。ここでは、But...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
'Invokeメソッドで使用するデリゲート
Delegate Function AddStringDelegate(ByVal str As String) ...
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'TextBox1の初期化
TextBox1.Text = ""
'スレッドの作成
Dim t As New Thread(New ThreadStart(AddressOf DoSomet...
t.IsBackground = True
'スレッドを開始する
t.Start()
End Sub
'別スレッドで実行するメソッド
Private Sub DoSomething()
'AddStringDelegateの作成
Dim dlg As New AddStringDelegate(AddressOf AddString)
Dim i As Integer
For i = 0 To 99
'TextBox1に追加する文字列
Dim str As String = i.ToString()
'TextBox1に文字列を追加する
'TextBox1は別スレッドが所有しているため、
'Invokeを使ってTextBox1を操作する
Dim count As Integer = _
CInt(TextBox1.Invoke(dlg, New Object() {str}))
'一秒停止
Thread.Sleep(1000)
Next i
End Sub
'TextBox1に文字列を追加する
Private Function AddString(ByVal str As String) As Integer
TextBox1.AppendText((str + ControlChars.CrLf))
Return TextBox1.Lines.Length
End Function
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
//Invokeメソッドで使用するデリゲート
private delegate int AddStringDelegate(string str);
private void Button1_Click(object sender, System.EventArg...
{
//TextBox1の初期化
TextBox1.Text = "";
//スレッドの作成
Thread t = new Thread(new ThreadStart(DoSomething));
t.IsBackground = true;
//スレッドを開始する
t.Start();
}
//別スレッドで実行するメソッド
private void DoSomething()
{
//AddStringDelegateの作成
AddStringDelegate dlg = new AddStringDelegate(AddStri...
for (int i = 0; i < 100; i++)
{
//TextBox1に追加する文字列
string str = i.ToString();
//TextBox1に文字列を追加する
//TextBox1は別スレッドが所有しているため、
//Invokeを使ってTextBox1を操作する
int count = (int) TextBox1.Invoke(dlg, new object...
//一秒停止
Thread.Sleep(1000);
}
}
//TextBox1に文字列を追加する
private int AddString(string str)
{
TextBox1.AppendText(str + "\r\n");
return TextBox1.Lines.Length;
}
}}
上記の例では、TextBox1を作成したスレッドはメインスレッド...
次にBeginInvoke、EndInvokeメソッドを使ってみましょう。Inv...
先ほどの例をBeginInvoke、EndInvokeメソッドを使って書き換...
#code(vbnet){{
'別スレッドで実行するメソッド
Private Sub DoSomething()
'AddStringDelegateの作成
Dim dlg As New AddStringDelegate(AddressOf AddString)
Dim i As Integer
For i = 0 To 99
'TextBox1に追加する文字列
Dim str As String = i.ToString()
'TextBox1に文字列を追加する
'TextBox1は別スレッドが所有しているため、
'Invokeを使ってTextBox1を操作する
Dim ar As IAsyncResult = _
TextBox1.BeginInvoke(dlg, New Object() {str})
'返り値を取得する
Dim count As Integer = CInt(TextBox1.EndInvoke(ar))
'一秒停止
Thread.Sleep(1000)
Next i
End Sub
}}
#code(csharp){{
//別スレッドで実行するメソッド
private void DoSomething()
{
//AddStringDelegateの作成
AddStringDelegate dlg = new AddStringDelegate(AddStri...
for (int i = 0; i < 100; i++)
{
//TextBox1に追加する文字列
string str = i.ToString();
//TextBox1に文字列を追加する
//TextBox1は別スレッドが所有しているため、
//Invokeを使ってTextBox1を操作する
IAsyncResult ar = TextBox1.BeginInvoke(dlg, new o...
//返り値を取得する
int count = (int) TextBox1.EndInvoke(ar);
//一秒停止
Thread.Sleep(1000);
}
}
}}
変わったのはInvokeの代わりにBeginInvokeとEndInvokeを使用...
あるコントロールに対してInvokeメソッドを使ってメソッドを...
InvokeRequiredプロパティを調べ、Invokeメソッドを使う必要...
#code(vbnet){{
'別スレッドで実行するメソッド
Private Sub DoSomething()
'AddStringDelegateの作成
Dim dlg As New AddStringDelegate(AddressOf AddString)
Dim count As Integer
Dim i As Integer
For i = 0 To 99
'TextBox1に追加する文字列
Dim str As String = i.ToString()
'TextBox1に文字列を追加する
'InvokeRequiredによりInvokeが必要か調べる
If TextBox1.InvokeRequired Then
'Invokeが必要な時はInvokeによりデリゲートを実行
count = CInt(TextBox1.Invoke(dlg, New Object(...
Else
'Invokeが必要ないときはそのままデリゲートを実行
count = CInt(dlg.DynamicInvoke(New Object() {...
End If
'一秒停止
Thread.Sleep(1000)
Next i
End Sub
}}
#code(csharp){{
//別スレッドで実行するメソッド
private void DoSomething()
{
//AddStringDelegateの作成
AddStringDelegate dlg = new AddStringDelegate(AddStri...
int count;
for (int i = 0; i < 100; i++)
{
//TextBox1に追加する文字列
string str = i.ToString();
//TextBox1に文字列を追加する
//InvokeRequiredによりInvokeが必要か調べる
if (TextBox1.InvokeRequired)
//Invokeが必要な時はInvokeによりデリゲートを...
count = (int) TextBox1.Invoke(dlg, new object...
else
//Invokeが必要ないときはそのままデリゲートを...
count = (int) dlg.DynamicInvoke(new object[] ...
//一秒停止
Thread.Sleep(1000);
}
}
}}
このようなコードを書くことにより、DoSomethingメソッドはど...
補足: ここでは
TextBox1.Invoke
としましたが、 TextBox1のあるフォームのInvokeメソッドを呼...
this.Invoke (VB.NETでは、Me.Invoke)
となります。
参考:
-[[コンポーネントのマルチスレッド>http://www.microsoft.co...
-[[スレッドからのコントロールの操作>http://www.microsoft....
-[[チュートリアル : Visual Basic による簡単なマルチスレッ...
-[[チュートリアル : Visual C# による簡単なマルチスレッド ...
-[[スレッドからのコントロールの操作>http://www.microsoft....
-[[マルチスレッド Windows フォーム コントロールのサンプル...
-[[フォームとコントロールでのマルチスレッド>http://www.mi...
***スレッドへデータを渡す、スレッドからデータを取得する [...
スレッドプールを使ってスレッドを開始する方法では、スレッ...
まず考えられるのが、データを渡す側、取得する側両方のスレ...
ただしこの方法でマルチスレッドメソッドから戻り値を取得す...
このコードでは、MyThreadメソッドを別スレッドで開始し、sle...
#code(vbnet){{
Class MainClass
'エントリポイント
Public Shared Sub Main()
'スレッドに渡すデータを設定する
sleepTime = 10000
'Threadオブジェクトを作成する
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf My...
'スレッドを開始する
t.Start()
'スレッドtが終わるまで待機する
t.Join()
'結果を表示する
Console.WriteLine(returnValue)
Console.ReadLine()
End Sub
'スレッドが返す値
Private Shared returnValue As Integer
'スレッドに渡す値
Private Shared sleepTime As Integer
'別スレッドで実行するメソッド
Private Shared Sub MyThread()
Dim start As Integer = System.Environment.TickCount
'長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始")
'sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime)
'処理が終わったことを知らせる
Console.WriteLine("終わりました")
'実際にかかった時間を返す
returnValue = System.Environment.TickCount - start
End Sub
End Class
}}
#code(csharp){{
class MainClass
{
//エントリポイント
public static void Main()
{
//スレッドに渡すデータを設定する
sleepTime = 10000;
//Threadオブジェクトを作成する
System.Threading.Thread t =
new System.Threading.Thread(
new System.Threading.ThreadStart(MyThread...
//スレッドを開始する
t.Start();
//スレッドtが終わるまで待機する
t.Join();
//結果を表示する
Console.WriteLine(returnValue);
Console.ReadLine();
}
//スレッドが返す値
private static int returnValue;
//スレッドに渡す値
private static int sleepTime;
//別スレッドで実行するメソッド
private static void MyThread()
{
int start = System.Environment.TickCount;
//長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始");
//sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime);
//処理が終わったことを知らせる
Console.WriteLine("終わりました");
//実際にかかった時間を返す
returnValue = System.Environment.TickCount - start;
}
}
}}
ヘルプ「マルチスレッド プロシージャのパラメータと戻り値」...
-[[マルチスレッド プロシージャのパラメータと戻り値>http:/...
#code(vbnet){{
'マルチスレッドメソッドのためのクラス
Class SampleClass
'スレッドが返す値
Public ReturnValue As Integer
'スレッドに渡す値
Public SleepTime As Integer
'別スレッドで実行するメソッド
Public Sub MyThread()
Dim start As Integer = System.Environment.TickCount
'長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始")
'sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(SleepTime)
'処理が終わったことを知らせる
Console.WriteLine("終わりました")
'実際にかかった時間を返す
ReturnValue = System.Environment.TickCount - start
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'SampleClassオブジェクトの作成
Dim sample As New SampleClass
'スレッドに渡すデータを設定する
sample.SleepTime = 10000
'Threadオブジェクトを作成する
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf sa...
'スレッドを開始する
t.Start()
'スレッドtが終わるまで待機する
t.Join()
'結果を表示する
Console.WriteLine(sample.ReturnValue)
Console.ReadLine()
End Sub
End Class
}}
#code(csharp){{
//マルチスレッドメソッドのためのクラス
class SampleClass
{
//スレッドが返す値
public int ReturnValue;
//スレッドに渡す値
public int SleepTime;
//別スレッドで実行するメソッド
public void MyThread()
{
int start = System.Environment.TickCount;
//長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始");
//sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(SleepTime);
//処理が終わったことを知らせる
Console.WriteLine("終わりました");
//実際にかかった時間を返す
ReturnValue = System.Environment.TickCount - start;
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//SampleClassオブジェクトの作成
SampleClass sample = new SampleClass();
//スレッドに渡すデータを設定する
sample.SleepTime = 10000;
//Threadオブジェクトを作成する
System.Threading.Thread t =
new System.Threading.Thread(
new System.Threading.ThreadStart(sample.M...
//スレッドを開始する
t.Start();
//スレッドtが終わるまで待機する
t.Join();
//結果を表示する
Console.WriteLine(sample.ReturnValue);
Console.ReadLine();
}
}
}}
別スレッドから戻り値を取得するための方法としては、コール...
次の例は上記のコードをさらに書き換え、別スレッドで実行さ...
#code(vbnet){{
'マルチスレッドメソッドのためのクラス
Class SampleClass
'スレッドが結果を返すためのコールバックデリゲート
Delegate Sub MyThreadCallback(ByVal returnValue As In...
Private callbackDelegate As MyThreadCallback
'スレッドに渡す値
Private sleepTime As Integer
'コンストラクタ
Public Sub New(ByVal time As Integer, _
ByVal callback As MyThreadCallback)
'コンストラクタでデータを受け取る
sleepTime = time
callbackDelegate = callback
End Sub
'別スレッドで実行するメソッド
Public Sub MyThread()
Dim start As Integer = System.Environment.TickCount
'長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始")
'sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime)
'処理が終わったことを知らせる
Console.WriteLine("終わりました")
'コールバックデリゲートを実行して結果を返す
If Not (callbackDelegate Is Nothing) Then
callbackDelegate((System.Environment.TickCoun...
End If
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'SampleClassオブジェクトの作成
'同時にデータを渡す
Dim sample As New SampleClass(10000, _
New SampleClass.MyThreadCallback(AddressOf Ge...
'Threadオブジェクトを作成する
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf sa...
'スレッドを開始する
t.Start()
Console.ReadLine()
End Sub
'スレッド終了時に呼び出されるコールバック関数
Private Shared Sub GetCallbackResult(ByVal returnValu...
'結果を表示する
Console.WriteLine(returnValue)
End Sub
End Class
}}
#code(csharp){{
//マルチスレッドメソッドのためのクラス
class SampleClass
{
//スレッドが結果を返すためのコールバックデリゲート
public delegate void MyThreadCallback(int returnValue);
private MyThreadCallback callbackDelegate;
//スレッドに渡す値
private int sleepTime;
//コンストラクタ
public SampleClass(int time, MyThreadCallback callback)
{
//コンストラクタでデータを受け取る
sleepTime = time;
callbackDelegate = callback;
}
//別スレッドで実行するメソッド
public void MyThread()
{
int start = System.Environment.TickCount;
//長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始");
//sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime);
//処理が終わったことを知らせる
Console.WriteLine("終わりました");
//コールバックデリゲートを実行して結果を返す
if (callbackDelegate != null)
callbackDelegate(System.Environment.TickCount...
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//SampleClassオブジェクトの作成
//同時にデータを渡す
SampleClass sample = new SampleClass(10000,
new SampleClass.MyThreadCallback(GetCallbackR...
//Threadオブジェクトを作成する
System.Threading.Thread t =
new System.Threading.Thread(
new System.Threading.ThreadStart(sample.M...
//スレッドを開始する
t.Start();
Console.ReadLine();
}
//スレッド終了時に呼び出されるコールバック関数
private static void GetCallbackResult(int returnValue)
{
//結果を表示する
Console.WriteLine(returnValue);
}
}
}}
**コメント [#l95f8bad]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-01-27 (火) 06:00:00,DOB...
終了行:
#title(.NETプログラミング研究 第25号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第25号 [#a503a075]
**.NET Tips [#pc3e9439]
**.NETのマルチスレッドプログラミング その7 [#vdc5818c]
#column(注意){{
この記事の最新版は「[[.NETのマルチスレッドプログラミング>...
}}
***別スレッドからフォーム、コントロールを扱う [#yf546e81]
マルチスレッドプログラミングで注意すべき様々な問題につい...
というのは、コントロール(フォームも含む)のメソッドは、...
-[[マルチスレッド Windows フォーム コントロールのサンプル...
(注1:ただし、Invoke、BeginInvoke、EndInvoke、CreateGrap...
まずはInvokeメソッドの使用法を説明します。Invokeメソッド...
+コントロールのメソッドを呼び出すためのメソッドを作成する。
+そのメソッドに合ったデリゲートを宣言する。
+コントロール(あるいはコントロールの親フォーム)のInvoke...
といったようになります。
次にInvokeメソッドを使った具体例を示します。ここでは、But...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
'Invokeメソッドで使用するデリゲート
Delegate Function AddStringDelegate(ByVal str As String) ...
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'TextBox1の初期化
TextBox1.Text = ""
'スレッドの作成
Dim t As New Thread(New ThreadStart(AddressOf DoSomet...
t.IsBackground = True
'スレッドを開始する
t.Start()
End Sub
'別スレッドで実行するメソッド
Private Sub DoSomething()
'AddStringDelegateの作成
Dim dlg As New AddStringDelegate(AddressOf AddString)
Dim i As Integer
For i = 0 To 99
'TextBox1に追加する文字列
Dim str As String = i.ToString()
'TextBox1に文字列を追加する
'TextBox1は別スレッドが所有しているため、
'Invokeを使ってTextBox1を操作する
Dim count As Integer = _
CInt(TextBox1.Invoke(dlg, New Object() {str}))
'一秒停止
Thread.Sleep(1000)
Next i
End Sub
'TextBox1に文字列を追加する
Private Function AddString(ByVal str As String) As Integer
TextBox1.AppendText((str + ControlChars.CrLf))
Return TextBox1.Lines.Length
End Function
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
//Invokeメソッドで使用するデリゲート
private delegate int AddStringDelegate(string str);
private void Button1_Click(object sender, System.EventArg...
{
//TextBox1の初期化
TextBox1.Text = "";
//スレッドの作成
Thread t = new Thread(new ThreadStart(DoSomething));
t.IsBackground = true;
//スレッドを開始する
t.Start();
}
//別スレッドで実行するメソッド
private void DoSomething()
{
//AddStringDelegateの作成
AddStringDelegate dlg = new AddStringDelegate(AddStri...
for (int i = 0; i < 100; i++)
{
//TextBox1に追加する文字列
string str = i.ToString();
//TextBox1に文字列を追加する
//TextBox1は別スレッドが所有しているため、
//Invokeを使ってTextBox1を操作する
int count = (int) TextBox1.Invoke(dlg, new object...
//一秒停止
Thread.Sleep(1000);
}
}
//TextBox1に文字列を追加する
private int AddString(string str)
{
TextBox1.AppendText(str + "\r\n");
return TextBox1.Lines.Length;
}
}}
上記の例では、TextBox1を作成したスレッドはメインスレッド...
次にBeginInvoke、EndInvokeメソッドを使ってみましょう。Inv...
先ほどの例をBeginInvoke、EndInvokeメソッドを使って書き換...
#code(vbnet){{
'別スレッドで実行するメソッド
Private Sub DoSomething()
'AddStringDelegateの作成
Dim dlg As New AddStringDelegate(AddressOf AddString)
Dim i As Integer
For i = 0 To 99
'TextBox1に追加する文字列
Dim str As String = i.ToString()
'TextBox1に文字列を追加する
'TextBox1は別スレッドが所有しているため、
'Invokeを使ってTextBox1を操作する
Dim ar As IAsyncResult = _
TextBox1.BeginInvoke(dlg, New Object() {str})
'返り値を取得する
Dim count As Integer = CInt(TextBox1.EndInvoke(ar))
'一秒停止
Thread.Sleep(1000)
Next i
End Sub
}}
#code(csharp){{
//別スレッドで実行するメソッド
private void DoSomething()
{
//AddStringDelegateの作成
AddStringDelegate dlg = new AddStringDelegate(AddStri...
for (int i = 0; i < 100; i++)
{
//TextBox1に追加する文字列
string str = i.ToString();
//TextBox1に文字列を追加する
//TextBox1は別スレッドが所有しているため、
//Invokeを使ってTextBox1を操作する
IAsyncResult ar = TextBox1.BeginInvoke(dlg, new o...
//返り値を取得する
int count = (int) TextBox1.EndInvoke(ar);
//一秒停止
Thread.Sleep(1000);
}
}
}}
変わったのはInvokeの代わりにBeginInvokeとEndInvokeを使用...
あるコントロールに対してInvokeメソッドを使ってメソッドを...
InvokeRequiredプロパティを調べ、Invokeメソッドを使う必要...
#code(vbnet){{
'別スレッドで実行するメソッド
Private Sub DoSomething()
'AddStringDelegateの作成
Dim dlg As New AddStringDelegate(AddressOf AddString)
Dim count As Integer
Dim i As Integer
For i = 0 To 99
'TextBox1に追加する文字列
Dim str As String = i.ToString()
'TextBox1に文字列を追加する
'InvokeRequiredによりInvokeが必要か調べる
If TextBox1.InvokeRequired Then
'Invokeが必要な時はInvokeによりデリゲートを実行
count = CInt(TextBox1.Invoke(dlg, New Object(...
Else
'Invokeが必要ないときはそのままデリゲートを実行
count = CInt(dlg.DynamicInvoke(New Object() {...
End If
'一秒停止
Thread.Sleep(1000)
Next i
End Sub
}}
#code(csharp){{
//別スレッドで実行するメソッド
private void DoSomething()
{
//AddStringDelegateの作成
AddStringDelegate dlg = new AddStringDelegate(AddStri...
int count;
for (int i = 0; i < 100; i++)
{
//TextBox1に追加する文字列
string str = i.ToString();
//TextBox1に文字列を追加する
//InvokeRequiredによりInvokeが必要か調べる
if (TextBox1.InvokeRequired)
//Invokeが必要な時はInvokeによりデリゲートを...
count = (int) TextBox1.Invoke(dlg, new object...
else
//Invokeが必要ないときはそのままデリゲートを...
count = (int) dlg.DynamicInvoke(new object[] ...
//一秒停止
Thread.Sleep(1000);
}
}
}}
このようなコードを書くことにより、DoSomethingメソッドはど...
補足: ここでは
TextBox1.Invoke
としましたが、 TextBox1のあるフォームのInvokeメソッドを呼...
this.Invoke (VB.NETでは、Me.Invoke)
となります。
参考:
-[[コンポーネントのマルチスレッド>http://www.microsoft.co...
-[[スレッドからのコントロールの操作>http://www.microsoft....
-[[チュートリアル : Visual Basic による簡単なマルチスレッ...
-[[チュートリアル : Visual C# による簡単なマルチスレッド ...
-[[スレッドからのコントロールの操作>http://www.microsoft....
-[[マルチスレッド Windows フォーム コントロールのサンプル...
-[[フォームとコントロールでのマルチスレッド>http://www.mi...
***スレッドへデータを渡す、スレッドからデータを取得する [...
スレッドプールを使ってスレッドを開始する方法では、スレッ...
まず考えられるのが、データを渡す側、取得する側両方のスレ...
ただしこの方法でマルチスレッドメソッドから戻り値を取得す...
このコードでは、MyThreadメソッドを別スレッドで開始し、sle...
#code(vbnet){{
Class MainClass
'エントリポイント
Public Shared Sub Main()
'スレッドに渡すデータを設定する
sleepTime = 10000
'Threadオブジェクトを作成する
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf My...
'スレッドを開始する
t.Start()
'スレッドtが終わるまで待機する
t.Join()
'結果を表示する
Console.WriteLine(returnValue)
Console.ReadLine()
End Sub
'スレッドが返す値
Private Shared returnValue As Integer
'スレッドに渡す値
Private Shared sleepTime As Integer
'別スレッドで実行するメソッド
Private Shared Sub MyThread()
Dim start As Integer = System.Environment.TickCount
'長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始")
'sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime)
'処理が終わったことを知らせる
Console.WriteLine("終わりました")
'実際にかかった時間を返す
returnValue = System.Environment.TickCount - start
End Sub
End Class
}}
#code(csharp){{
class MainClass
{
//エントリポイント
public static void Main()
{
//スレッドに渡すデータを設定する
sleepTime = 10000;
//Threadオブジェクトを作成する
System.Threading.Thread t =
new System.Threading.Thread(
new System.Threading.ThreadStart(MyThread...
//スレッドを開始する
t.Start();
//スレッドtが終わるまで待機する
t.Join();
//結果を表示する
Console.WriteLine(returnValue);
Console.ReadLine();
}
//スレッドが返す値
private static int returnValue;
//スレッドに渡す値
private static int sleepTime;
//別スレッドで実行するメソッド
private static void MyThread()
{
int start = System.Environment.TickCount;
//長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始");
//sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime);
//処理が終わったことを知らせる
Console.WriteLine("終わりました");
//実際にかかった時間を返す
returnValue = System.Environment.TickCount - start;
}
}
}}
ヘルプ「マルチスレッド プロシージャのパラメータと戻り値」...
-[[マルチスレッド プロシージャのパラメータと戻り値>http:/...
#code(vbnet){{
'マルチスレッドメソッドのためのクラス
Class SampleClass
'スレッドが返す値
Public ReturnValue As Integer
'スレッドに渡す値
Public SleepTime As Integer
'別スレッドで実行するメソッド
Public Sub MyThread()
Dim start As Integer = System.Environment.TickCount
'長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始")
'sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(SleepTime)
'処理が終わったことを知らせる
Console.WriteLine("終わりました")
'実際にかかった時間を返す
ReturnValue = System.Environment.TickCount - start
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'SampleClassオブジェクトの作成
Dim sample As New SampleClass
'スレッドに渡すデータを設定する
sample.SleepTime = 10000
'Threadオブジェクトを作成する
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf sa...
'スレッドを開始する
t.Start()
'スレッドtが終わるまで待機する
t.Join()
'結果を表示する
Console.WriteLine(sample.ReturnValue)
Console.ReadLine()
End Sub
End Class
}}
#code(csharp){{
//マルチスレッドメソッドのためのクラス
class SampleClass
{
//スレッドが返す値
public int ReturnValue;
//スレッドに渡す値
public int SleepTime;
//別スレッドで実行するメソッド
public void MyThread()
{
int start = System.Environment.TickCount;
//長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始");
//sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(SleepTime);
//処理が終わったことを知らせる
Console.WriteLine("終わりました");
//実際にかかった時間を返す
ReturnValue = System.Environment.TickCount - start;
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//SampleClassオブジェクトの作成
SampleClass sample = new SampleClass();
//スレッドに渡すデータを設定する
sample.SleepTime = 10000;
//Threadオブジェクトを作成する
System.Threading.Thread t =
new System.Threading.Thread(
new System.Threading.ThreadStart(sample.M...
//スレッドを開始する
t.Start();
//スレッドtが終わるまで待機する
t.Join();
//結果を表示する
Console.WriteLine(sample.ReturnValue);
Console.ReadLine();
}
}
}}
別スレッドから戻り値を取得するための方法としては、コール...
次の例は上記のコードをさらに書き換え、別スレッドで実行さ...
#code(vbnet){{
'マルチスレッドメソッドのためのクラス
Class SampleClass
'スレッドが結果を返すためのコールバックデリゲート
Delegate Sub MyThreadCallback(ByVal returnValue As In...
Private callbackDelegate As MyThreadCallback
'スレッドに渡す値
Private sleepTime As Integer
'コンストラクタ
Public Sub New(ByVal time As Integer, _
ByVal callback As MyThreadCallback)
'コンストラクタでデータを受け取る
sleepTime = time
callbackDelegate = callback
End Sub
'別スレッドで実行するメソッド
Public Sub MyThread()
Dim start As Integer = System.Environment.TickCount
'長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始")
'sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime)
'処理が終わったことを知らせる
Console.WriteLine("終わりました")
'コールバックデリゲートを実行して結果を返す
If Not (callbackDelegate Is Nothing) Then
callbackDelegate((System.Environment.TickCoun...
End If
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'SampleClassオブジェクトの作成
'同時にデータを渡す
Dim sample As New SampleClass(10000, _
New SampleClass.MyThreadCallback(AddressOf Ge...
'Threadオブジェクトを作成する
Dim t As New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf sa...
'スレッドを開始する
t.Start()
Console.ReadLine()
End Sub
'スレッド終了時に呼び出されるコールバック関数
Private Shared Sub GetCallbackResult(ByVal returnValu...
'結果を表示する
Console.WriteLine(returnValue)
End Sub
End Class
}}
#code(csharp){{
//マルチスレッドメソッドのためのクラス
class SampleClass
{
//スレッドが結果を返すためのコールバックデリゲート
public delegate void MyThreadCallback(int returnValue);
private MyThreadCallback callbackDelegate;
//スレッドに渡す値
private int sleepTime;
//コンストラクタ
public SampleClass(int time, MyThreadCallback callback)
{
//コンストラクタでデータを受け取る
sleepTime = time;
callbackDelegate = callback;
}
//別スレッドで実行するメソッド
public void MyThread()
{
int start = System.Environment.TickCount;
//長い時間のかかる処理があるものとする
Console.WriteLine("スレッド開始");
//sleepTimeミリ秒停止する
System.Threading.Thread.Sleep(sleepTime);
//処理が終わったことを知らせる
Console.WriteLine("終わりました");
//コールバックデリゲートを実行して結果を返す
if (callbackDelegate != null)
callbackDelegate(System.Environment.TickCount...
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//SampleClassオブジェクトの作成
//同時にデータを渡す
SampleClass sample = new SampleClass(10000,
new SampleClass.MyThreadCallback(GetCallbackR...
//Threadオブジェクトを作成する
System.Threading.Thread t =
new System.Threading.Thread(
new System.Threading.ThreadStart(sample.M...
//スレッドを開始する
t.Start();
Console.ReadLine();
}
//スレッド終了時に呼び出されるコールバック関数
private static void GetCallbackResult(int returnValue)
{
//結果を表示する
Console.WriteLine(returnValue);
}
}
}}
**コメント [#l95f8bad]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-01-27 (火) 06:00:00,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]