C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

マルチスレッドについて

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87918 / inTopicNo.1)  マルチスレッドについて
  
□投稿者/ 夜叉丸 (124回)-(2018/07/13(Fri) 10:01:05)

分類:[.NET 全般] 

フォームにlabel1, label2を貼り付けて
timer1.Enabled = true, timer1.Interval = 100 に設定し、
以下のようなプログラムを作ってみたところ
終了時に
this.Invoke(delegatemethod, new object[] { label });
のところでエラーが出ます。

@これを回避するにはどうすればよいのでしょうか?


 public partial class Form1 : Form
 {
  public Form1()
  {
   InitializeComponent();
  }

  delegate void SetLabelCallback(Label label);
  private void Setlabel(Label label)
  {
   if (label.IsDisposed) return;
   if (label.InvokeRequired)
   {
    SetLabelCallback delegatemethod = new SetLabelCallback(Setlabel);
    this.Invoke(delegatemethod, new object[] { label });
   } else label.Text = DateTime.Now.ToString("hh:mm:ss");
  }

  private void Form1_Load(object sender, EventArgs e)
  {
   Thread t_time = new Thread(new ThreadStart(TimeView));
   t_time.Start();

   /*
   Task.Run・・・・ ←使い方がわからない
   */

   // 以下通常処理
  }

  private void TimeView()
  {
   while (true)
   {
    Setlabel(label2);
    Thread.Sleep(100);
   }
  }

  private void timer1_Tick(object sender, EventArgs e)
  {
   label1.Text = DateTime.Now.ToString("hh:mm:ss");
  }
 }

また、.net4 以降では Thread ではなく Task を使うことが推奨されていますが
ネットを調べてみると
Task.Run( () => {} )
のようになっていますが、RUNが見つかりません。

A上記の使い方でTaskを使用するにはどうすればよいのでしょうか?

B今回のように時間を表示する場合で、
Thread.Sleep()を使用した場合はTimer,Threadの処理が
停止してしまうのですが、Thread.Sleep()中でも動作させることはできるのでしょうか?

C今回の場合はTimerとThreadのどちらを使うのがよいのでしょうか?
また、TimerとThread(またはTask)を使いわける判断を教えてください。

引用返信 編集キー/
■87919 / inTopicNo.2)  Re[1]: マルチスレッドについて
□投稿者/ WebSurfer (1556回)-(2018/07/13(Fri) 10:38:10)
No87918 (夜叉丸 さん) に返信

直接の回答ではなくてすみません。

昔に戻るということではないと理解していますが、Timer とか Thread を使うという
ことであれば、一度以下の記事の目を通されてはいかがでしょう。特に第2回。C 当
たりの疑問に対する答えが見つかるかもしれません。

第1回 マルチスレッドはこんなときに使う (1/2)
http://www.atmarkit.co.jp/ait/articles/0503/12/news025.html

第2回 .NETにおけるマルチスレッドの実装方法を総括 (1/4)
http://www.atmarkit.co.jp/ait/articles/0504/20/news111.html

第3回 マルチスレッドでデータの不整合を防ぐための排他制御 ―
マルチスレッド・プログラミングにおける排他制御と同期制御(前編) ― (1/3)
http://www.atmarkit.co.jp/ait/articles/0505/25/news113.html

第4回 デッドロックの回避とスレッド間での同期制御 ―
マルチスレッド・プログラミングにおける排他制御と同期制御(後編) ― (1/3)
http://www.atmarkit.co.jp/ait/articles/0506/15/news114.html

引用返信 編集キー/
■87928 / inTopicNo.3)  Re[1]: マルチスレッドについて
□投稿者/ Jitta (389回)-(2018/07/13(Fri) 20:59:05)
No87918 (夜叉丸 さん) に返信

> フォームにlabel1, label2を貼り付けて
> timer1.Enabled = true, timer1.Interval = 100 に設定し、
> 以下のようなプログラムを作ってみたところ
> 終了時に
> this.Invoke(delegatemethod, new object[] { label });
> のところでエラーが出ます。
>
> @これを回避するにはどうすればよいのでしょうか?

 まず、なぜ、そのエラーが発生するのか、考えてください。
そのコードは、いつ、なぜ、実行されるのでしょうか。
「マルチスレッド」とは、どういうものなのでしょうか。
終了するとき、どういうことが起こっているのでしょうか。

こういったことを理解しておくことで、次に発生した問題を自力で解決ができるようになります。
午前10時に投稿して、午後8時の時点で解決していないわけですが、
上記のことを理解していれば、10時間あれば解決できていたと思います。



> また、.net4 以降では Thread ではなく Task を使うことが推奨されていますが
> ネットを調べてみると
> Task.Run( () => {} )
> のようになっていますが、RUNが見つかりません。
>
> A上記の使い方でTaskを使用するにはどうすればよいのでしょうか?

 使用するフレームワークは、4.5 以上になっていますか?
https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.task%28v=vs.100%29.aspx
4 だと、Start のようです。



> B今回のように時間を表示する場合で、
> Thread.Sleep()を使用した場合はTimer,Threadの処理が
> 停止してしまうのですが、Thread.Sleep()中でも動作させることはできるのでしょうか?

 質問の意図がわかりません。
Sleep は、その名の通り、スレッドを眠らせます。眠っている間は、何もできません。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ