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

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

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

Re[2]: ある処理の間、タスク遷移を禁止するには


(過去ログ 30 を表示中)

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

■14485 / inTopicNo.1)  ある処理の間、タスク遷移を禁止するには
  
□投稿者/ shin (1回)-(2008/02/19(Tue) 20:29:36)

分類:[C#] 

こんばんは。
行き詰ったので質問させてください。

言語はC#です。

void aaa(byte a)
{
send(a);
System.Threading.Thread.Sleep(2);
send(^a);
}

上記のような処理があります。
複数のタスクが存在するソフトで、そのうちのひとつのタスクが、この処理を実行します。

そこで質問です。
この3行の処理の間、他のタスクへ処理の遷移をさせない方法を、ご存知であれば教えてください。
様は、ディスパッチ禁止区間としたいのです。


上記のsendは実際には、組み込み機器へシリアル通信を行っており、2msec後に反転したデータを送る必要があります。
通常上記のソースを実行すると、2msec後には送れず、はるかに時間がかかってしまいます。(今は10msecぐらい)
これを確実に2msec後に送るにはどうすればいいか、というのが大元の問題です。

よろしくお願いします。
引用返信 編集キー/
■14487 / inTopicNo.2)  Re[1]: ある処理の間、タスク遷移を禁止するには
□投稿者/ やじゅ (174回)-(2008/02/19(Tue) 22:08:03)
やじゅ さんの Web サイト
No14485 (shin さん) に返信
> 言語はC#です。
> 上記のsendは実際には、組み込み機器へシリアル通信を行っており、2msec後に反転したデータを送る必要があります。
> 通常上記のソースを実行すると、2msec後には送れず、はるかに時間がかかってしまいます。(今は10msecぐらい)
> これを確実に2msec後に送るにはどうすればいいか、というのが大元の問題です。

C#をあきらめるとか。
その部分だけ、アンマネージドで作成して、呼ぶだけにするとか
引用返信 編集キー/
■14490 / inTopicNo.3)  Re[1]: ある処理の間、タスク遷移を禁止するには
□投稿者/ 渋木宏明(ひどり) (652回)-(2008/02/19(Tue) 23:40:42)
渋木宏明(ひどり) さんの Web サイト
> これを確実に2msec後に送るにはどうすればいいか、というのが大元の問題です。

「確実に」は無理です。

そもそも PC のハードウェア自体が多くの非同期部分を持っているし、Windows もリアルタイム処理には適さない OS なので。

スワップなんか起きた日にはどれだけ遅延するか分からないし、場合によってはマウスカーソルをぐりぐり動かしただけでも遅延が発生します。


引用返信 編集キー/
■14491 / inTopicNo.4)  Re[1]: ある処理の間、タスク遷移を禁止するには
□投稿者/ myugaru (8回)-(2008/02/19(Tue) 23:59:20)
myugaru さんの Web サイト
2008/02/20(Wed) 00:18:29 編集(投稿者)
2008/02/20(Wed) 00:17:26 編集(投稿者)

No14485 (shin さん) に返信
> これを確実に2msec後に送るにはどうすればいいか、というのが大元の問題です。

もうちょい真剣に調べたほうがよいですね。
Sleepなんていういい加減なタイマーで2msec計ろうとしてる時点で前途多難だと思います。
(ちょっと私の言葉がひどかったので修正いたしました。すみません)

引用返信 編集キー/
■14492 / inTopicNo.5)  Re[2]: ある処理の間、タスク遷移を禁止するには
□投稿者/ myugaru (9回)-(2008/02/20(Wed) 00:07:19)
myugaru さんの Web サイト
2008/02/20(Wed) 00:20:48 編集(投稿者)
2008/02/20(Wed) 00:18:01 編集(投稿者)

No14491 (myugaru さん) に返信
> ■No14485 (shin さん) に返信
>>これを確実に2msec後に送るにはどうすればいいか、というのが大元の問題です。
>
> もうちょい真剣に調べたほうがよいですね。
> Sleepなんていういい加減なタイマーで2msec計ろうとしてる時点で前途多難だと思います。
>

言いっぱなしもアレなんでたとえばってことで今ちょこっと調べたんですが、
こういうの見つかりましたよ。参考になるかしら?
(リンク先よく読んだら結局解決策は無さげ?しかも渋木宏明(ひどり)さんがお答えになっているという^^;)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=27114
引用返信 編集キー/
■14493 / inTopicNo.6)  Re[1]: ある処理の間、タスク遷移を禁止するには
□投稿者/ myugaru (11回)-(2008/02/20(Wed) 00:42:21)
myugaru さんの Web サイト
No14485 (shin さん) に返信
> こんばんは。
> 行き詰ったので質問させてください。
>
> 言語はC#です。
>
> void aaa(byte a)
> {
> send(a);
> System.Threading.Thread.Sleep(2);
> send(^a);
> }
>

こうするとどうでしょうか?
前提条件として、
1.send(~a)の失敗が何らかの手段でわかる
2.send(~a)失敗時はsend(a)から再試行できる
という2条件が満たされれば以下のような繋がるまで再試行って方法がとれそうですが。
(あるいはsend(~a)だけ何回も試行しなおせるならそれでもいいのですが)

void aaa(byte a)
{
bool stat=false;
for (int i=0; !stat; i++) {
send(a);
for (int j=0; j<i; j++);
send(^a);
//★ここでなんらかの手段でsend(~a)の可否を確認しstatに入れる
}
}

引用返信 編集キー/
■14498 / inTopicNo.7)  Re[1]: ある処理の間、タスク遷移を禁止するには
□投稿者/ Jitta on the way (34回)-(2008/02/20(Wed) 07:28:15)
No14485 (shin さん) に返信
> こんばんは。
> 行き詰ったので質問させてください。
>
> 言語はC#です。
>
> void aaa(byte a)
> {
> send(a);
> System.Threading.Thread.Sleep(2);
> send(^a);
> }
>
> 上記のような処理があります。
> 複数のタスクが存在するソフトで、そのうちのひとつのタスクが、この処理を実行します。
>
> そこで質問です。
> この3行の処理の間、他のタスクへ処理の遷移をさせない方法を、ご存知であれば教えてください。
> 様は、ディスパッチ禁止区間としたいのです。
>
>
> 上記のsendは実際には、組み込み機器へシリアル通信を行っており、2msec後に反転したデータを送る必要があります。
> 通常上記のソースを実行すると、2msec後には送れず、はるかに時間がかかってしまいます。(今は10msecぐらい)
> これを確実に2msec後に送るにはどうすればいいか、というのが大元の問題です。
>
> よろしくお願いします。

Sleep って、「nミリ秒処理を停止する」ではなく、「最低でもnミリ秒は、このスレッドに処理を移さない」だったと思う。
引用返信 編集キー/
■14526 / inTopicNo.8)  Re[2]: ある処理の間、タスク遷移を禁止するには
□投稿者/ shin (2回)-(2008/02/21(Thu) 08:30:42)
なるほど。
言われてみれば、windows上で動くプログラムは、OSにいつCPU使用権をとられるか分からないのは、当たり前の事ですね。
クリティカルな処理を、別の方法で考えてみたいと思います。

ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -