範囲内でのフラグの状態を把握するには? – プログラミング – Home

範囲内でのフラグの状態を把握するには?
 
通知
すべてクリア

[解決済] 範囲内でのフラグの状態を把握するには?


ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

動作環境:VC++6.0、MFC、WINXPとWIN2000
お世話になっております。

<前提>
マルチスレッドプログラムで処理の途中緊急停止を要求されることがあります。
その際に現在走っているスレッドはグローバルな緊急停止フラグが立っていたら
以降の処理を実行させずに終了することとしています。

<現状>
現在では上記処理を実現するために下のような3つの処理を行うスレッドがあります。

UNIT *(LPVOID )
{
処理1
フラグ判定
処理2
フラグ判定
処理3
以下省略
}
停止命令を受け付けた場合は以下の処理を絶対に実行させたくないため
処理が終わるごとに判定をして停止フラグを見つけたら終了としています・・・
これでは処理が2~3個なら問題はないのですがやや冗長となってしまいます。

<質問>
そこで、ある範囲内で指定の変数にある値が入っていたらGotoするような
手法があるのでしょうか?
VBかなにか(Notes?)で処理内でエラーコードを見つけたらGotoするといった感じのものが
会ったのは覚えているのですが、それをCでさらに「変数」を監視するようなものが
あるのでしょうか?

イメージとしてはこのような感じです。

UNIT *(LPVOID )
{
//ここから
処理1
処理2
処理3
以下省略
return;
//ここまでの間でFlagに1が立っていたらGoto a
a:
終了処理
return;
}


引用未解決
トピックタグ
ボコノン教徒
 ボコノン教徒
(@ボコノン教徒)
ゲスト
結合: 23年前
投稿: 90
 

・例外をスローする
・やっぱり、地道にフラグ判定を行う

int flg;
int step=1;
while(フラグ判定){
switch(step){
case 1:
処理1
step=2;
break;
case 2:
処理2
step=3;
break;
case 3:
処理3

}


返信引用
ボコノン教徒
 ボコノン教徒
(@ボコノン教徒)
ゲスト
結合: 23年前
投稿: 90
 

#おっと、間違えて送ってしまった。

・例外をスローする
・やっぱり、地道にフラグ判定を行う
良く使う方法として、以下のやり方があります。
処理をいろんなステップへ飛ばすこともできます。

UNIT *(LPVOID )
{
int step=1;
while(フラグ判定){
switch(step){
case 1:
//処理1
step++;
break;
case 2:
//処理2
step++;
break;
case 3:
//処理3
return 0;//正常終了
}
default:
break;//???
}
}
//エラー処理
return 0xFFFFFFFF;
}


返信引用
ボコノン教徒
 ボコノン教徒
(@ボコノン教徒)
ゲスト
結合: 23年前
投稿: 90
 

> ・例外をスローする
例外はスレッドをまたげないので、無意味ですな。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

案1)
フラグ判定を以下のようにする。
はさむコードは1行なので、
それほど冗長な感じにならないかもしれない。

void CheckFlag() { if (flag) throw interrupted!; }

UNIT *(LPVOID )
{
try {
処理1
CheckFlag();
処理2
CheckFlag();
処理3
CheckFlag();
以下省略
} catch(const char* ) {
...
}
}

案2)
各処理を関数にして配列にし、ループで呼び出す。

void (*steps[])() = { 処理1,処理2,... };

for (int i = 0; ...) {
(steps[i])();
if (フラグ判定) break;
}


返信引用
ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

返答遅れまして申し訳ありません。

>>ボコノン教徒さん
ケース文を使えば場合分けされた処理も見やすくなり
判定式も使いまわしができますね!
この方法をとる事にしました。

>>dairygoodsさん
案1-2)
工夫次第で冗長な式もずいぶんシンプルになりますね!
勉強不足のため配列関数というものの存在すら知らなかったです!
ですがこれを機会に覚えることができました。
いつもありがとうございます^-^

ご回答、有難うございます。
解決です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました