OS:Windows2000
VB:VisualBasic6.0 ServicePack6
------------------------------
DoEventsに関しての質問です。
Winsock の SendProgress イベントで送信をキャンセルする時の為に DoEvents を
書いたところ、「スタック領域が不足しています」 とのエラーが出てしまいました。
*ヘルプには、DoEvents の呼び出しすぎと書いてありました。
DoEvents のかわりに、別の方法でキャンセルが出来るようにする事は可能でしょうか?
No.1ベストアンサー
- 回答日時:
SendProgress イベントは、送信中に起動されるので、おそらくガンガンかかってしまい、ネストしまくってスタックオーバフローを起こしているような感じでは?
Winsockなら、パケット通信だと思いますので、「別の方法」といえばパケット間(SendComplete)でキャンセルするとか・・・
プログラムのつくり方にもよりますが、送信前にキャンセルされているかどうかをチェックできればそれがいいような気がします。
>送信をキャンセルする
パケット長は、数kBなので送信中(SendProgress)イベントでキャンセルするタイミングがあるかどうか、が問題ですね。
この回答への補足
Winsockだけでなく他の事(ファイル検索等)の再帰処理でも使いたいのですが、
APIやその他を使ってDoEventsと同じ事をさせる方法もあれば教えて頂けますでしょうか。
(コマンドボタンを押してコードが実行完了するまで、
他のボタンが押せなくなってしまうのでそれを回避したい。)
No.3
- 回答日時:
>再帰をして階層が深くなると同じようにスタック領域~のエラーが出るので、
>DoEvents が使えない
DoEvents が使えないわけではなく、DoEvents(Windowsのイベント処理)の中から、あなたのプログラムのイベントがガンガン起動されているからオーバーフローしているのだと思います。
つまり、該当のイベントがくるようなところでなければ、ネストは少なくてすみますから、DoEventsを書いても大丈夫です。
>再帰をして階層が深くなると・・・・
これは、次の再帰プログラムの原則を守れば大丈夫。もちろんDoEventsも使えます。
(1)極力スタック(引数やローカル変数など)を使用しない
(2)再帰の最大回数を制限(または予測)できる場合にのみ使用する
ただ、あくまで原則で、たとえばネット上のファイル検索で検索中にガンガンファイルコピーされて、
対象のファイルが増えてゆくなんて場合は、再帰の使用自体を考え直す必要があります。
今思いつく対策は、3つくらいかな。
(1)再入しないようなプログラムにする。イベントの初めに、イベント生起を止める。
VBのTimerだと、Enable=False にするとかです。
ただWinsock のように相手がある場合は、通信が変になるので使えないでしょうけど
(2)マルチスレッドにして、イベント処理レベルのルーチンを切り離す
再帰は、上位のルーチンで使用します。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/99 …
とか、
http://homepage2.nifty.com/kasayan/vba/doevents. …
あたりが参考になるかも・・
(3)OSのイベントをフックしたりマスクしたりして、ごまかす。
今回、これは論外でしょうね。
でも、Windows、MAC以外のOSをいじっているプログラマならかなり現実的な候補なんです。
#DOS時代からプログラムいじってますが、「スタックオーバーフロー」は、久しく見ていないので、懐かしく思いつつ・・・
No.2
- 回答日時:
>APIやその他を使ってDoEventsと同じ事をさせる方法もあれば教えて頂けますでしょうか。
そのための「DoEvents」なんですが・・・
API で実現する場合は、基本的には、C言語(しかもSDK)のようなメッセージループの中に書くか、コールバック関数を利用することになると思います。関数名としては、ほとんどがSendMessageA()なので、一般的な説明はしづらいです。
ご質問のようなエラーは、Winsock(のようなOCX)からコールバックされたイベントですから、その中でさらにDoEventsするのは、Winsockが動いてしまい危険。
VBのイベントは、Windows(やOCX)からコールバックされているので、できれば、その中にDoevents(Windowsの仕事をさせるようなこと)をさせないほうがいいです。
また、VBのDoEventsは、結構良くできていて、市販やフリーのCコンパイラでまじめに作るのと比べると、処理時間がかなり早い。
(多分Windowsでのタスク切り替えに不要な部分が大幅にカットされているんだと思います。M$だからできることですね)
モノにもよりますが、WinsockのSendProgress イベントには、せいぜい文字を点滅させるとか、カンタンで素早いプログラムにしたほうがいいと思います。
>(コマンドボタンを押してコードが実行完了するまで、
> 他のボタンが押せなくなってしまうのでそれを回避したい。)
「ファイルの検索」とかなら、VBのイベントを使わないでできるはずですから、DoEventsでOK。
この回答への補足
(これはWinsockの件ではなく)
再帰をして階層が深くなると同じようにスタック領域~のエラーが出るので、
DoEvents が使えない状態なので他の方法があるのかお聞きしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA ステータスバー DoEvents 1 2023/03/30 12:22
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- その他(家計・生活費) 予約した自転車をキャンセルしたい 4 2022/05/16 18:52
- メルカリ メルカリのトラブルについて 基本は購入者側です。数回、出品はしました。 私は一年程前から始めましたが 2 2022/04/20 23:42
- メルカリ メルカリでの誤発送トラブルに関して。 メルカリで私が誤った商品を発送してしまい、取引メッセージでもお 1 2023/08/02 00:15
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
VB6 DoEventsの代わりは?
Visual Basic(VBA)
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
VB6のwinsockでconnectできない
Visual Basic(VBA)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
成人式の代表者ってどう選ぶの...
-
えべっさんに行けなかった時
-
月の最後の週の呼び名は?
-
昔は何歳くらいからお酒を飲ん...
-
10月をもって辞めるって、10...
-
鏡餅のプラスチック製ミカンの...
-
入社が2月1日とした場合、3ヶ月...
-
自治会の通常総会の年度について
-
成人式で「変わってないね」は...
-
エクセルのフィルターを複数シ...
-
確認ですが普通5月までに決める...
-
総会の年度表記について
-
昔の愛称?「~の字」
-
カレンダーの日付 5/Bの意味に...
-
お正月お供えしていた橙は、お...
-
「1年以上」の定義について
-
VBAで先月、先々月を求める方法
-
「なんで付き合おうと思ったか...
-
8月までっていつまでのことでし...
-
学校の在籍機関
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
仲の良い男友達から「クリスマ...
-
10月をもって辞めるって、10...
-
月の最後の週の呼び名は?
-
クリスマスとクリスマスイブセ...
-
エクセルのフィルターを複数シ...
-
入社が2月1日とした場合、3ヶ月...
-
8月までっていつまでのことでし...
-
カレンダーの日付 5/Bの意味に...
-
昔の愛称?「~の字」
-
元彼からメリークリスマスとLIN...
-
彼氏がクリスマスバイトをいれ...
-
昔は何歳くらいからお酒を飲ん...
-
1月8日で1年記念日なのですが、...
-
一日は夜から始まる?
-
クリスマスに彼氏と会えないの...
-
「1年以上」の定義について
-
25日彼氏とクリスマスで会う約...
-
VBAで先月、先々月を求める方法
-
鏡餅のプラスチック製ミカンの...
-
「6月まで」というのは6月以内...
おすすめ情報