DOBON.NET DOBON.NETプログラミング掲示板過去ログ

キャンセルボタンが押せない

環境/言語:[Windows XP VC++]
分類:[.NET]

実行ボタンとキャンセルボタンを設け、実行ボタンを押すと、時間のかかる処理が始まり、それを止めるために、キャンセルボタンを押したいですが、処理が終わらないとキャンセルボタンが押せない状態です。どうすれば、処理実行中にも他のボタン(キャンセルボタン)が押せるようにできるでしょうか?
どなたか後存知の方、よろしくご教授ください。
>どうすれば、処理実行中にも他のボタン(キャンセルボタン)が押せるようにできるでしょうか?

「処理」を別スレッドで実行するか、タイマーなどを使って「処理」を1度に少しずつ実行するようにします。
あとは、Application.DoEvents メソッド で OS 側に適宜制御を返すとか。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsApplicationClassDoEventsTopic.asp
  • 題名: 渋木宏明さん、じゃんぬねっとさん、ありがとうございます。
  • 著者: tulip
  • 日時: 2005/09/24 15:50:19
  • ID: 12939
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
渋木宏明さん、じゃんぬねっとさん、
教えてくださってありがとうございます。
早速試してみます。
初心者でマルチスレッドは難しいそうなので、プログラム中に適所Application.DoEvents()を組み込む方法を先に試してみたんですが、なぜか認識してくれないです。調べたらApplicationの名前空間は、System.Windows.Formsだったので、using System.Windows.Forms; と
using namespace System.Windows.Forms; と先頭に記述してみたんですが、両方とも構文エラーが出ました。
どこがおかしいでしょうか?
教えてください。よろしくお願いします。
■No12940に返信(tulipさんの記事)
> なぜか認識してくれないです。
> 調べたらApplicationの名前空間は、System.Windows.Formsだったので、
> using System.Windows.Forms; と
> using namespace System.Windows.Forms; と先頭に記述してみたんですが、
> 両方とも構文エラーが出ました。
> どこがおかしいでしょうか?
構文エラーが出たのであれば、当然メッセージはご覧になってますよね? ( ´・ω・)σ
何て書いてありました?

> 教えてください。
> よろしくお願いします。
System.Windows.Forms.Application.DoEvents(); ではどうですか?
> System.Windows.Forms.Application.DoEvents(); ではどうですか?
このように記述を変えてみました。それでもエラーが次のようにでます。

error C2065: 'System' : 定義されていない識別子です。
error C2228: '.Application' : 左側がクラス、構造体、共用体ではありません。
error C2228: '.DoEvents' : 左側がクラス、構造体、共用体ではありません。
error C2228: '.Forms' : 左側がクラス、構造体、共用体ではありません。
error C2228: '.Windows' : 左側がクラス、構造体、共用体ではありません。

ちなみに、ある市販の評価用プログラムに機能追加をしようとして苦戦しているところですが。。。
VC++.NET 2002を使っているんですが、関係あるんでしょうか?
すみません、よろしくお願いします。
2005/09/25(Sun) 02:30:59 編集(投稿者)

■No12942に返信(tulipさんの記事)
> ちなみに、ある市販の評価用プログラムに機能追加をしようとして苦戦しているところですが。。。
> VC++.NET 2002を使っているんですが、関係あるんでしょうか?
> すみません、よろしくお願いします。
MC++のコードになっているのでしょうか?
アンマネージであると、マネージドクラスは使えません。

ちなみに、
> System.Windows.Forms.Application.DoEvents();
ではなく
System::Windows::Forms::Application::DoEvents();
ではないでしょうか?
2005/09/25(Sun) 05:23:52 編集(投稿者)

一応、私のサイトで解説しています。

DOBON.NET .NET Tips - 時間のかかる処理をユーザーが停止できるようにする
http://dobon.net/vb/dotnet/programing/abortprocess.html
> MC++のコードになっているのでしょうか?
> アンマネージであると、マネージドクラスは使えません。

プロジェクトのプロパティを調べたら、確かに、構成プロパティ 全般→マネージ拡張:がいいえになっていました。これをはいにして、また、
C/C++全般→マネージとしてコンパイル:アセンブリ サポート (/clr) に設定してビルドしてみましたが、次のエラーがでてきました。
"KIT1110Sample コマンド ライン error D2016 : コマンド ライン オプション '/RTC1' と '/clr' は同時に指定できません"
なんで、
C/C++全般→マネージとしてコンパイル:マネージ拡張を使用しない という設定に戻しましたら、コンパイルは通りますが、次のエラーがでます。
error C2065: 'DoEvents' : 定義されていない識別子です。
error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。
また、C/C++全般→マネージとしてコンパイル:アセンブリ サポート (/clr) だけを設定してビルとしても、
KIT1110Sample コマンド ライン error D2016 : コマンド ライン オプション '/RTC1' と '/clr' は同時に指定できません
というエラーがでます。

記述は、
System::Windows::Forms::Application::DoEvents(); を使いました。

設定にまだおかしいところがあると思うんですが、、、
■No12944に返信(管理人さんの記事)
> 2005/09/25(Sun) 05:23:52 編集(投稿者)
>
> 一応、私のサイトで解説しています。
>
> DOBON.NET .NET Tips - 時間のかかる処理をユーザーが停止できるようにする
> http://dobon.net/vb/dotnet/programing/abortprocess.html

拝見させていただきました。ありがとうございます。
マルチスレッドは難しいと思って試してないですが、がんばってやってみます。
ところで、VC++.NET のサンプルまたは解説例はないでしょうか?ご存知でしたら、教えていただきたいですが。
VC++.NET開発キットについてくるサンプル(マルチスレッドに関するサンプル例)も見ましたが、難しくて、、、
> プロジェクトのプロパティを調べたら、確かに、構成プロパティ 全般→マネー> ジ拡張:がいいえになっていました。これをはいにして、また、
これだけでは無理なのでは?(詳しくないのでわかりませんが。)

やはり、.NETの機能を使わずにやるしかないようですが。
(スレッドにして処理させるしかないかと。)

ところで、そのプロジェクトはMFCを利用しているのでしょうか?
> やはり、.NETの機能を使わずにやるしかないようですが。
> (スレッドにして処理させるしかないかと。)

そうですか。がんばってスレッドでやってみます。

> ところで、そのプロジェクトはMFCを利用しているのでしょうか?
MFCを利用しているとおもいが、というのは、
#include <afxwin.h> & <afxwin.h> & <afxdtctl.h> & <afxcmn.h> があるで、そうかなって思いますが、MFCの利用有無で何か関連があるんでしょうか?

今回のプロジェクトは、VC++ 6.0 で書かれたものを、VC++.NETで再ビルドして、機能を追加しようとしているものなんです。この辺にも問題があるでしょうか?
やっぱり開発環境をVC++ 6.0 に戻したほうがよさそうでしょうか?
> VC++ 6.0 で書かれたものを
をマネージドのプロジェクトに変更するのがダメなのではないのでしょうか?

.NETのコードのことは無視したほうがいいです。というかできないかと。

MFCをつかっているのならば、やはり別スレッドをつくることになります。
AfxBeginThread 等をしらべられるとみちは開けると思います。
# MFCの質問になるので、ここの掲示板はいた違いになるような。。。
# 一度ここは閉じて、VC専門の掲示板で聞くほうがいいかも。
> をマネージドのプロジェクトに変更するのがダメなのではないのでしょうか?
> .NETのコードのことは無視したほうがいいです。というかできないかと。
> MFCをつかっているのならば、やはり別スレッドをつくることになります。
> AfxBeginThread 等をしらべられるとみちは開けると思います。
> # MFCの質問になるので、ここの掲示板はいた違いになるような。。。
> # 一度ここは閉じて、VC専門の掲示板で聞くほうがいいかも。

なるほど、そうなんですか。わかりました、VC専門の掲示板を見つけていろいろ教えていただきます。
レスを下さったみなさん、どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板