ループ処理中に他のコントロールを制御するには – プログラミング – Home

ループ処理中に他のコントロールを制御す...
 
通知
すべてクリア

[解決済] ループ処理中に他のコントロールを制御するには


box
 box
(@box)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

初カキコさせていただきます。

早速ですが質問なのですが、ボタンを押すとループ処理を開始して
そのボタンをすぐに停止と変更してループ処理を中断できるように
したいのですが、処理が始まってしまうとループが終わるまでそのボタンに
限らず、フォームのコントロール全て触れない状態になってしまいます。
一度処理をはじめてしまうと20分ほどかかる処理のため、機能的には
必須のものとして考えなければなりません。

方々探してみたのですが、経験もなく答えもみつけるのが非常に
困難な為、どなたかご存知の方おられましたら意見をいただけますでしょうか。
よろしくお願いします。


引用未解決
トピックタグ
CHS
 CHS
(@CHS)
ゲスト
結合: 23年前
投稿: 2
 

CHSと申します。
スレッドとか色々手段はあります。
もし、for(;;) loop を使っておられるならば次のようなのはどうでしょう。
書籍にはよく例として出ています。
「中止」ボタンでグローバルな変数に値を入れ、for(;;) loop 中でグローバルな変数を
常に関ししておいて、条件があえば、for(;;)loop からbreakしてしまうものです。

int stop = 0; /* 0で初期化 */

/*「中止」ボタンのハンドラ */
void xxxView::OnStop()
{
stop = 1 /* 中止ボタンが押されたら1を入れる*/
}

/* 「処理開始」ボタンのハンドラ */
void xxxView::OnStart()
{
MSG message;
:
:
for(;;) {
:
:
if( ::PeekMessage( &message, NULL, 0, 0, PM_REMOVE ) ) {
::TranslateMessage( &message );
::DispatchMessage( &message );
}
:
:
if(stop == 1)
break;
}


返信引用
渡り鳥
 渡り鳥
(@渡り鳥)
ゲスト
結合: 23年前
投稿: 14
 

>処理が始まってしまうとループが終わるまでそのボタンに
>限らず、フォームのコントロール全て触れない状態になってしまいます。

とのことなので,やはりスレッドを作成してそこで処理を行う必要がありそうです.
あとはCHSさんの例のように中止ボタンを押したらスレッドにメッセージを投げてやるなど
してループ処理を終了させてやるとうまくいきそうですねA^^;)


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

スレッド (AfxBeginThread) を使う方法です。

ヘダーファイルに2つのメンバー変数を追加。
public:
BOOL bLOOP; //TRUE ならLOOP中
CWinThread* pThread;

コンストラクタに
bLOOP = FALSE;

それと
UINT MyLoop(LPVOID pParam)
{
BOOL* pbLOOP = (BOOL*)pParam;

while (1)
{
if (*pbLOOP == FALSE)
{
AfxEndThread (0);
return 0;
}
//ここにLoop処理
}
return 0;
}

void C***View::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
if (bLOOP)
{
m_BTN.SetWindowText(実行);
bLOOP = FALSE;
} else {
m_BTN.SetWindowText(停止);
bLOOP = TRUE;
pThread = AfxBeginThread (MyLoop, &bLOOP, THREAD_PRIORITY_NORMAL);
}
}

詳しいことは AfxBeginThread などで検索すると色々あります。
http://hp.vector.co.jp/authors/VA007799/tips/tips6.htm


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

追記します。
MyLOOP 中の return 0; を break; に変更してください。m(__)m
UINT MyLoop(LPVOID pParam)
{
BOOL* pbLOOP = (BOOL*)pParam;

while (1)
{
if (*pbLOOP == FALSE)
{
AfxEndThread (0);
//return 0;
break; //ここです。
}
//ここにLoop処理
}
return 0;
}


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

CHSさん、渡り鳥さん、tissさん
色々ご意見ありがとうございます。
自分なりに改良等加えてやってみます。

経験、知識ともに乏しいもので、時間がかかると
思いますが、また分からなければよろしくお願いします。
それと返信送れて申し訳ありません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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