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

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

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

二つのコードを同時に実行するにはどうしたらいいですか?

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

■88259 / inTopicNo.1)  二つのコードを同時に実行するにはどうしたらいいですか?
  
□投稿者/ クマムシ (1回)-(2018/08/16(Thu) 20:07:28)

分類:[VB.NET/VB2005 以降] 

VB.NETを使って、ある装置の制御プログラムを書いています。

その中で二つのコードを同時に実行したいのですが
どのようにすれば良いですか?

すぐに思いついた方法は以下のように

        Task.Factory.StartNew(
         Sub()

		コードA

         End Sub)

		コードB

マルスレッドにして、
二つのコードを投げる方法です。
しかし、この方法だと、コードAが実行されてから
コードBが実行されるまでの間にミリ秒オーダーでタイムラグが発生すると思います。

どうにか同時に実行したいのですが
どのようにすれば良いでしょうか?





引用返信 編集キー/
■88260 / inTopicNo.2)  Re[1]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ Azulean (967回)-(2018/08/16(Thu) 20:31:29)
2018/08/16(Thu) 20:33:51 編集(投稿者)

No88259 (クマムシ さん) に返信
> しかし、この方法だと、コードAが実行されてから
> コードBが実行されるまでの間にミリ秒オーダーでタイムラグが発生すると思います。

その「ミリ秒オーダーのタイムラグ」が受容できないものなのですか?
そうであれば、Windows を使って作るのは誤りだと思えます。


> どうにか同時に実行したいのですが
> どのようにすれば良いでしょうか?

先にも書きましたが、Windows では一方のコードと他方のコードが同時に実行されることを保証する仕組みは存在しませんので、「できません」となります

大まかに理解するならこの記事を読んでみてはいかがでしょうか。
http://www.atmarkit.co.jp/ait/articles/1410/30/news150_2.html

引用返信 編集キー/
■88261 / inTopicNo.3)  Re[1]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ Hongliang (673回)-(2018/08/16(Thu) 20:32:06)
少なくともWindowsでは、厳密・正確・確実に同時実行させるのは不可能です。
// 空いているCPUコアが1つしかないなら物理的に不可能ですし。
引用返信 編集キー/
■88262 / inTopicNo.4)  Re[2]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ クマムシ (2回)-(2018/08/16(Thu) 20:35:54)
ありがとうございます。

マルチコアで使用していないコアがあることが前提です。

Windowsだと完全に同時に実行することはできないことは分かりました、
その中でももっともタイムラグの小さな方法をお教えいただけないでしょうか?
Task.Factory.StartNew(
Sub()

コードA

End Sub)

コードB
よりも、もっと良いコートがあればお教えください。
引用返信 編集キー/
■88263 / inTopicNo.5)  Re[3]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ Hongliang (674回)-(2018/08/16(Thu) 20:58:35)
同時に開始さえできれば、処理中に片方が寝ても問題ないのですか?
あと最初の質問文に装置の制御とか書かれていましたが、両方でそれぞれに装置にアクセスするとかそういうのがありますか? であればそもそもその装置へのアクセスが並行処理を受け付けるのかって話も出てきますが…。
引用返信 編集キー/
■88264 / inTopicNo.6)  Re[4]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ クマムシ (4回)-(2018/08/16(Thu) 21:02:57)
片方が寝る、というのはどういう意味でしょうか?

一つの装置に同時にアクセスするのではなく
異なる装置に対する同時アクセスなので
装置側は問題ないと思います
引用返信 編集キー/
■88265 / inTopicNo.7)  Re[5]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ Azulean (968回)-(2018/08/16(Thu) 21:18:59)
No88264 (クマムシ さん) に返信
> 片方が寝る、というのはどういう意味でしょうか?

先に私が書いたリンク先の記事にも書いていますが、スレッドは常に実行されているわけではなく、Windows の制御によって、他のプロセス・スレッドにも順番に処理機会を与えるために、中断と再開が繰り返されます。
Windows によって自動的に制御されるため、自分が作ったスレッド A とスレッド B の処理の進み方が同じになる保証はありません。

こういった実情があるので、数ミリのずれは気にせず、普通に A → B と順番に開始するようにコードを書いたら良いのでは?と思う次第です。

引用返信 編集キー/
■88266 / inTopicNo.8)  Re[6]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ クマムシ (5回)-(2018/08/16(Thu) 21:38:15)
言い忘れましたが、
処理をするのは装置側なので、Windowsはジョブを投げたら、
あとは処理が終わるまで待っているだけです。
なので、ジョブを投げる時だけ
二つ同時にできれば、後は問題ありません

引用返信 編集キー/
■88267 / inTopicNo.9)  Re[7]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ おろちまる (2回)-(2018/08/17(Fri) 07:07:48)
No88266 (クマムシ さん) に返信

ラッチを使って競馬のゲートのようなことをできた気がします。
複数のスレッドの準備が終わるのを待って一斉にスタートって感じで。

.NETにはCountdownEventクラスってのがあるみたいですよ。

引用返信 編集キー/
■88270 / inTopicNo.10)  Re[7]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ Azulean (969回)-(2018/08/17(Fri) 07:26:52)
No88266 (クマムシ さん) に返信
> なので、ジョブを投げる時だけ
> 二つ同時にできれば、後は問題ありません

それはすでに No88261 でも言われているように「そういう仕組みはない」という答えになります。


「厳密な話」を置いておいて、誤差をなるべく少なくしたいなら、Thread クラスで 2 つ処理を作ってから、Start を2つ続けて呼ぶのが良いかもしれませんね。
それで実験したらいかがですか?

なお、実験してうまくいったとしても、先に書いたとおり、厳密な保証はないので「状況によってはずれは大きくなる」ということは、Windows で作る以上、避けられません。
Windows は起動しただけで、何も動かしていなくても、多数のプロセス・サービス・スレッドが動いているので、スレッドのスイッチングを防げませんので。
引用返信 編集キー/
■88271 / inTopicNo.11)  Re[1]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ 774RR (625回)-(2018/08/17(Fri) 10:20:53)
真に同時性が要求させる案件なら装置側にトリガー信号入力があるはずなので、単純に出力一つを出してハードウェアで信号分岐させるとか。
組み込み系でいう同時は真に同時でなければならないわけで(一桁ナノ秒が要求されるのはざら)プログラムでどうこうという選択肢は最初からなかったりしますな。

抽象的な質問には一般論しか返せませんぜ。
引用返信 編集キー/
■88272 / inTopicNo.12)  Re[2]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ Hongliang (675回)-(2018/08/17(Fri) 10:38:02)
とりあえずWindowsアプリケーション側で頑張ろうとするなら、

1. CountdownEventとManualResetEvent(初期値2)を用意
2. 以下のThreadStartを持ったThreadを2つ作る
  2.1. CountdownEvent::Signal()
  2.2. ManualResetEvent::WaitOne()
  2.3. 目的の処理
3. 各ThreadをStart
4. CountdownEvent::Wait()してからManualResetEvent::Set()

ぐらいかな。

引用返信 編集キー/
■88273 / inTopicNo.13)  Re[8]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ はまぐり (53回)-(2018/08/17(Fri) 10:58:42)
No88267 (おろちまる さん) に返信

> .NETにはCountdownEventクラスってのがあるみたいですよ。

引用返信 編集キー/
■88274 / inTopicNo.14)  Re[3]: 二つのコードを同時に実行するにはどうしたらいいですか?
□投稿者/ はまぐり (54回)-(2018/08/17(Fri) 11:08:22)
やべ、送信ミスった

>■No88267 (おろちまる さん) に返信
> .NETにはCountdownEventクラスってのがあるみたいですよ。

スレッドの足並みを揃える用途ではBarrierクラスってのもあって
さてどれがいいでしょうねと確認してみました

https://paiza.io/projects/cX-J7GTyS8TSBdE8JFXkPw

スレッドを起こすのに時間がかかるんだという状況を作るために
意図的にSpinWaitをはさんだ場合Barrierクラスが性能良かったです

SpinWaitを入れない場合何も使わないのが性能よかったです

引用返信 編集キー/

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


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

このトピックに書きこむ