X



【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0414デフォルトの名無しさん
垢版 |
2018/09/23(日) 18:38:22.45ID:cRG95Xcq
vs使えばexpressエディションでも標準装備されてる
0415デフォルトの名無しさん
垢版 |
2018/09/23(日) 23:53:10.56ID:nKMJRhW5
>>413>>414
ありがとうございます
すみません。言語はCなんですが、スマートポインタなるものは使えるのでしょうか
VSのほう先ずは試してみます
0416デフォルトの名無しさん
垢版 |
2018/09/24(月) 00:23:01.63ID:Kxio7RVg
とりあえずこんな感じのコードで軽くお試しできる
デバッグモードで実行するとデバッグコンソールにリークしてるログが出力される
コメントはずしてfree()で解放するとリークしてるログがなくなる

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

void aho(void) {
  void* p = malloc(100);
  // free(p);
}

int main(void) {
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  aho();
  return 0;
}

↓詳細はココみなさい
https://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx

あとはもうできるハズだ
0419デフォルトの名無しさん
垢版 |
2018/09/24(月) 07:47:25.22ID:A22Aay1A
入門の+operator演算子で訳わからず詰んでしまったのですが
簡単に分かりやすく解説してるサイトないですか?
0421デフォルトの名無しさん
垢版 |
2018/09/24(月) 10:37:05.34ID:nAcFE6zY
>>416>>417
ありがとうございます
頑張ってみます!
0424デフォルトの名無しさん
垢版 |
2018/09/27(木) 01:59:28.90ID:HwqzTUAF
http://codepad.org/gwutTCie
AIUEOを何回も呼び出したいとき、引数のa, b, c, d, eの部分が共通なので
何回もa, b, c, d, eと書かなくても良いようにしようと色々試しましたが中々上手く行きません
別にコピペすればいいのでそんなに気にすることでもないと思うのですが、
こんなときはどのように書いたら良いのでしょうか?
0425デフォルトの名無しさん
垢版 |
2018/09/27(木) 02:11:57.91ID:Oj9x/TA+
>>424
意図を把握できてるか自信はないが↓のbinded_AIUEOみたいなことでいいのん?

void MACRO(int a, int b, int c, int d, int e, int s, int t) {
 auto binded_AIUEO = [=](int x, int y, int z){ AIUEO(a, b, c, d, e, x, y, z); };
 if (s < 0) {
  if (t < 0) binded_AIUEO(-1, -2, -3);
  else binded_AIUEO(3, 0, 7);
 }
 else {
  if (s < t) binded_AIUEO(4, 99, 8);
  else binded_AIUEO(333, 33, 3);
 }
}
0428デフォルトの名無しさん
垢版 |
2018/09/27(木) 12:00:19.82ID:QfV3dtaO
void foo(int argc, const char *argv[])
{
}

int main(int argc, char *argv[])
{
  foo(argc, argv);
  return 0;
}

VC++2008でコンパイルすると、
「error C2664: 'foo' : 2 番目の引数を 'char *[]' から 'const char *{}' に変換できません。」
ってなるんだけどなんで?
constから非constならわかるんだけど。
0429デフォルトの名無しさん
垢版 |
2018/09/27(木) 12:27:29.59ID:3irDnMHM
type ミスなのかコピペなのか判断に迷うとこだけど

'char *[]' から 'const char *{}' 後者が { } になってるあたりにヒントは無い?
0431428
垢版 |
2018/09/27(木) 13:06:59.87ID:QfV3dtaO
>>429,430
失礼。428の書き込みがタイプミスで、実際のソースコードは [] なのですが
コンパイルエラーになります。

>>430
なるほど・・・↓にも同じようなことが書いてありますね。
https://social.msdn.microsoft.com/Forums/ja-JP/24cd88de-2159-4e8b-aee7-3fa30d8647db/12509124521253112479123982144229031124343830625968123952819312?forum=vcgeneralja

ちなみにVC2003では通ってたらしいです。
0432デフォルトの名無しさん
垢版 |
2018/09/27(木) 14:04:18.04ID:rwW0e8CF
>>431
2010ではエラーにならなかったな
2008固有の問題なのかも知れない

foo(argc, (const char **)argv);
こうしてみたらどうだろう
0433デフォルトの名無しさん
垢版 |
2018/09/27(木) 17:43:51.14ID:HwqzTUAF
>>425 >>426 >>427
ありがとうございます
これのマクロ版を書くときはどのようにすれば良いのかと思いました
例えば #define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z)
とすると1, 2, 3, 4, 5ではなくa, b, c, d, eとそのままの文字で展開されてしまいます
0434はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/27(木) 18:37:57.80ID:nKTHsEzL
>>433
こんな感じかな?

#define MACRO(a, b, c, d, e, s, t) {\
#define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z) \
if (s < 0) {\
if (t < 0) BINDED_AIUEO(-1, -2, -3) \
else BINDED_AIUEO(3, 0, 7) \
}\
else {\
if (s < t) BINDED_AIUEO(4, 99, 8) \
else BINDED_AIUEO(333, 33, 3) \
}\
#undef BINDED_AIUEO \
}

この事例ではどうしてもマクロじゃなければ駄目という理由はなさそうだけど、
実際の利用シーンでは何か意味があるのかな?
0435デフォルトの名無しさん
垢版 |
2018/09/27(木) 19:16:32.64ID:Oj9x/TA+
>>434
それできたっけ?と思って試してみたらエラーになった
マクロの中では#は識別子の文字列化になる

可変長マクロを悪用してこんな感じにはできるけれども……おすすめはできない

#define packed_MACRO(s, t, ...) {\
 if (s < 0) {\
  if (t < 0) AIUEO(__VA_ARGS__, -1, -2, -3) \
  else AIUEO(__VA_ARGS__, 3, 0, 7) \
 }\
 else {\
  if (s < t) AIUEO(__VA_ARGS__, 4, 99, 8) \
  else AIUEO(__VA_ARGS__, 333, 33, 3) \
 }\
}
#define MACRO(a, b, c, d, e, s, t) {\
 packed_MACRO(s, t, a, b, c, d, e) \
}
0437はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/09/27(木) 19:59:57.14ID:nKTHsEzL
いずれにしても、マクロでやるのはおすすめできないパターンには違いない。
関数でやってもインライン化されたら定数畳み込みとのコンボで実行コードはだいたい同じような感じになるだろうし。
0438デフォルトの名無しさん
垢版 |
2018/09/27(木) 23:31:02.83ID:HwqzTUAF
>>434 >>435 >>437
ありがとうございます
素直にそのままa,b,c,d,eと書こうと思います
この例じゃない実際のコードは、速度を重視した結果マクロを使用することになったのですが、
冷静に考えてみれば計算数回ぐらいしか変わらないのでそこまでやる必要は無かったかもしれません
0439デフォルトの名無しさん
垢版 |
2018/10/01(月) 09:57:17.34ID:a9wHa9+i
MSVC2017+Windows10でレジストリを読み取ろうとしています。
RegEnumValueW(hKey, 0, name, &nameSize, 0, &type, value, &valueSize)
を実行してtypeがREG_SZのレジストリ入力を読み取ることには成功したのですが、
value先頭のvalueSizeバイトのユニコード文字列をstd::stringに変換する方法が
わからなくて困っています。

具体的にはwindowsのフォント名を読み取っていて、"arial.ttf"に対して
valueの中身を見ていくと、a\0r\0i\0…となっています。

LPBYTEからstringなのでとりあえずwchar_t*にしてからstringにすればよいのかと思ったのですが、
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, (int)(valueSize), NULL, 0));
でサイズ取得してから
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, valueSize, buff, size);
しても要素がchar→wchar_tに変わっただけで、\0も1文字になってしまいます。

できれば日本語にも対応したいので、下位ビットだけ読む、みたいな方法以外の対応を
探しています。ご存知の方いらっしゃらないでしょうか。
0441439
垢版 |
2018/10/01(月) 12:06:04.72ID:xWoUpfbZ
>> 440
WideCharToMultiByteでできました!
MSDNでunicode文字列を返すと書いてあったのでUTF16LEかと誤解していました。
ありがとうございました。
書き込むかわからないですが、今後は蟻様と呼ばせていただきます。
0442デフォルトの名無しさん
垢版 |
2018/10/01(月) 12:54:37.87ID:6nDzbmUC
> UTF16LEかと誤解していました
いやそこは間違ってないと思うよ
wchar_t* -> utf-16 (winに限る)
string -> 8859-1, utf-8, 等
0445デフォルトの名無しさん
垢版 |
2018/10/01(月) 13:13:26.38ID:6nDzbmUC
16bitに収まりきらない場合があるけど、可変長マルチバイトとは呼ばないかな
0447デフォルトの名無しさん
垢版 |
2018/10/01(月) 19:33:59.25ID:YHT/N1Mv
趣味の自作ゲームでC++を利用しています(多人数開発などは今後も予定なしで、人様のコードは読まない)

Cの「関数へのポインタ」ってC++のポリモーフィズムがあれば理解しなくてもなんとかなりますか?
関数へのポインタが手持ちの書籍だけではわからずにいるのですが、
柴田さんのポインタ本とか買ってまで理解する価値はあるでしょうか?
関数へのポインタの存在理由もわからずにいるので、頓珍漢な事を言っていたらすみません
0448デフォルトの名無しさん
垢版 |
2018/10/01(月) 19:46:15.36ID:46GwS6ij
C++のポリホーリズムの運用が完璧であれば問題ない
が、関数ポインタがその理解の助けになるかもしれない
0449デフォルトの名無しさん
垢版 |
2018/10/01(月) 20:33:18.13ID:YHT/N1Mv
ポリモーフィズム
(基底から派生させた各ザコキャラ(各々別クラス)のインスタンスを同じコンテナに入れて各々のメンバ関数(アクションなど)を実行する)
といったかんじで便利に運用できている(と思う)ので、
関数ポインタは理解しなくても大丈夫そうでしょうか
動的関数実行の他にはどんな用途に利用するものですか?
0450デフォルトの名無しさん
垢版 |
2018/10/01(月) 20:39:22.92ID:YHT/N1Mv
>>インスタンス
インスタンスではなくインスタンスへのポインタの間違いでした
0451はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/01(月) 21:10:49.05ID:hbafP85H
>>447
抽象クラスを活用してるってこと?
それが上手くいっているならほとんどの場合はその方が良いと思う。

ただ、仮想関数ってのは (言語仕様で決まりがあるわけではないが、一般的なコンパイラでは)
オブジェクトが暗黙に仮想関数テーブルへのポインタを持つことで実現されていて、
仮想関数テーブルには関数ポインタが格納されている。

つまり、仮想関数は関数ポインタを辿る処理を自動化したものなので、
メカニズムをよりよく理解したいなら関数ポインタのことも知っておくとわかりやすくなるかもしれない。

仮想関数テーブルの説明は Wikipedia に簡単なものがある。
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
0452デフォルトの名無しさん
垢版 |
2018/10/01(月) 21:30:32.77ID:YHT/N1Mv
>>仮想関数テーブルには関数ポインタが格納されている。
>>仮想関数は関数ポインタを辿る処理を自動化したものなので、
やはり関数ポインタが使われていたのですか

Cプログラム診断室のホームページを公開されてる藤原博文さんが
関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書かれていたので、初心者から脱したければ勉強すべきかもしれませんね
普通のポインタでも時々間違える事あるし、ポインタ本は買っておこうかな。

お答え頂きありがとうございました!
0453デフォルトの名無しさん
垢版 |
2018/10/01(月) 22:10:58.61ID:s5/CkhHO
VC++6.0で作っています。 MFCです。
普通にSDIを作りますが、そこからメニューバー等からダイアログボックスをモードレスで起動します。
すると、ダイアログを起動しながらメインウインドウも触れるようになるのですが、そのフォーカスを
モードレスダイアログとメインウインドウとをマウスを使わずにキーボードで切り替えることって出来ませんか

MSのWindowsOSのAlt+Tabではこれらはひとつとして認識されているようでこれでは切り替えられません
ちなみに、Windows7です
0454 ◆QZaw55cn4c
垢版 |
2018/10/01(月) 22:13:30.74ID:BhbfBp00
関数ポインタの使い道って…qsort() にて比較関数を指定するくらいしか思い浮かばないのですが…
他の関数に(キャストしまくった)関数ポインタを渡すことはあっても、自分で関数ポインタをコールする (*f)() のはあまりないのです…
0455デフォルトの名無しさん
垢版 |
2018/10/01(月) 22:35:50.82ID:88z5+fOs
関数に関数を渡す関数型っぽいのとオブジェクト指向は根柢から違うんじゃないか?
0456デフォルトの名無しさん
垢版 |
2018/10/01(月) 23:51:48.96ID:zfKNS/F/
#include <stdio.h>
typedef struct tag_baka_t t_baka_t;
typedef int (*baka_func_t)(t_baka_t const* pt_baka);

typedef struct tag_baka_t {
char* text;
baka_func_t function;
} t_baka_t;

int call_baka1(t_baka_t const* ct_baka) { fprintf(stdout, "baka1:%s\n", ct_baka->text); return 1; }
int call_baka2(t_baka_t const* ct_baka) { fprintf(stdout, "baka2:%s\n", ct_baka->text); return 2; }
int call_baka3(t_baka_t const* ct_baka) { fprintf(stdout, "baka3:%s\n", ct_baka->text); return 3; }

int call(t_baka_t const* ct_baka) {
return ct_baka->function(ct_baka);
}

int main(int argc, char* argv[]) {

t_baka_t baka1 = { "boo", call_baka1 };
t_baka_t baka2 = { "foo", call_baka2 };
t_baka_t baka3 = { "woo", call_baka3 };

fprintf(stdout, "called baka1 -> returned %d\n", call(&baka1));
fprintf(stdout, "called baka2 -> returned %d\n", call(&baka2));
fprintf(stdout, "called baka3 -> returned %d\n", call(&baka3));
return 0;
}

C言語の構造体ならコレでいける
コレならバカでもチョンでも分かる
C++の構造体でも同じように書ける
0457デフォルトの名無しさん
垢版 |
2018/10/02(火) 00:33:32.81ID:Cp0nvcbE
>◆QZaw55cn4c

いつまで荒らし行為を続ける気だ
0458はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/02(火) 02:33:55.94ID:wuORmtyC
>>454
スクリプト言語の拡張を C で書いたりすると、関数ポインタを使うこともまあまあある。

言語に限らずプラグイン的なものだと関数ポインタのやりとりは結構あるんじゃない?
Regnessem のプラグインを作ったことが有るが、プラグイン側の関数を本体に登録したりする
処理に関数ポインタは使ったぞ。

それはそうと、関係ないけど Lisp Scheme スレに書いてた疑問は解消できたの?
0459デフォルトの名無しさん
垢版 |
2018/10/02(火) 04:50:47.05ID:Cp0nvcbE
これで確認完了
0460デフォルトの名無しさん
垢版 |
2018/10/02(火) 05:07:06.87ID:WWljJiuT
>>458
> Lisp Scheme スレに書いてた疑問は解消できたの?
身辺が忙しくなってしましました、暇をみつけてじっくり考えています(ちょっと最初の方に戻っています)
0462デフォルトの名無しさん
垢版 |
2018/10/02(火) 09:46:02.89ID:bn0iLUpp
qsort のような、問題先送り系コールバック関数は関数のポインタになっちゃうわね
0465デフォルトの名無しさん
垢版 |
2018/10/04(木) 00:21:59.55ID:C6FTp/Pz
windows 10 でmingw5.3使ってて

#include <clocale>
#include <regex>
int main() {
std::setlocale(LC_ALL, "");
std::regex reg("^ [cC]");
return 0;
}

これでbad_allocが発生するんだけど、なんかだめなの?
0466デフォルトの名無しさん
垢版 |
2018/10/04(木) 07:26:56.12ID:TASd8bzQ
ファイルに書き込みを行うプログラムの章を勉強中なんですが
実行してもtextファイルに変化ありません…
visualstudioと同じフォルダに入れてもなんとも無い
どうすれば書き込み出来るんですか?
http://codepad.org/IJwmFcAD
0471デフォルトの名無しさん
垢版 |
2018/10/04(木) 16:40:22.50ID:TASd8bzQ
>>470
出来てないです。自分でデスクトップで作成したtest,txtファイルをフォルダに入れました
同名のファイルに書き込みが出来るプログラムかと思ってたのですがもしかして勘違いしてますか…?
0472デフォルトの名無しさん
垢版 |
2018/10/04(木) 16:45:04.26ID:qnqRQVWC
>>470
ファイルを絶対パスではなく相対パスで指定した場合は
プログラムを実行した時の作業ディレクトリが基準になる
0473デフォルトの名無しさん
垢版 |
2018/10/04(木) 17:45:40.20ID:TASd8bzQ
普通にプロジェクトと同じフォルダに出来てました。ありがとうございます
自分で作ったtxtファイルに書き込みがされるのかと思ってました…
0475はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/04(木) 20:10:36.56ID:1wg41Y30
>>465
mingw の setlocale は msvcrt の setlocale で、
空文字で呼出すとシステムにセットされているロケールになるんだけど、
日本語環境だともちろん日本語がセットされる。

で、どうにも std::regex はマルチバイト系の文字符号には対応してないっぽい。
英語、フランス語、ドイツ語とかで試すと問題なかったが、
日本語、中国語、韓国語で試すと bad_alloc になる。
bad_alloc になるのが意図的な動作なのかどうかわかんないけど。

std::wregex を使う分には日本語ロケールでも例外にはらない。
0476デフォルトの名無しさん
垢版 |
2018/10/05(金) 18:01:44.43ID:X1kF7PG7
クラスの宣言に下記のように書いたらエラーになりました

class test
{
char c[] = "abc";
}

このcという文字列はこのクラスの中でずっと定数として固定で使うのが目的です
class宣言部では宣言できないのでしょうか。どうしたらいいですか
char *c; とだけして、クラスのコンストラクタでnewで作るとか、定数なのでそんなことはしたくないのですが
0478はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/10/05(金) 18:21:51.16ID:Cnw78CfH
今どきは必要ないだろうけど、
古い仕様 (C++03) だとこう。

class test
{
static const char c[];
};

const char test::c[] = "abc";
0479デフォルトの名無しさん
垢版 |
2018/10/05(金) 18:43:28.91ID:X1kF7PG7
>>478
ありがとう。今どきは必要ないっていうのが気になりますが、今ではもっと他の方法があるということですか
C++の最新仕様では他の方法があるのでしょうか
0482デフォルトの名無しさん
垢版 |
2018/10/06(土) 15:18:56.24ID:n32kY+69
clsA a;
clsA b;
clsA c;
clsA *h[] = {&a, &b, &c};
void main{
h[0]->mfunc();
}
クラス配列のメンバー関数を呼び出すところでセグメントエラーになるんだが、なぜできないの?
0485デフォルトの名無しさん
垢版 |
2018/10/06(土) 16:46:18.35ID:5XBjQGBu
こんなのを見つけました。 下記でここってかいてある1行を書かないとエラーになります。ラベルの次に直接 } は来たらダメなのですか
}の直前にジャンプって出来ないのでしょうか
ここでfuncxは、funcx( CString& s, CString& sHit )となっています。sを与え小さくなっていきます
またこれでgotoを使わないようにはどう書けばいいでしょうか
これが楽なのでgotoを使っちゃいましたけど
コンパイラーは昔のVC++6.0です

CString ret, sHit;
do{
ret = func1( s, sHit );
if( sHit != "" ) goto label;
ret = func2( s, sHit );
if( sHit != "" ) goto label;
ret = func3( s, sHit );
if( sHit != "" ) goto label;
ret = func4( s, sHit );
if( sHit != "" ) goto label;
label:
ret = ret; <---- ここ !
}while( ret == "" && s != "" );
0487デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:29:07.42ID:5XBjQGBu
ああ、goto labelのところ、continueでいいのか
forだけじゃなくwhileが後ろにくるパターンでも使えるのですね
でも、 label: が ) の前に使えないってのはなんででしょうね
0488デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:31:40.03ID:5XBjQGBu
continueは、 { } の最後に飛ぶのではなく頭に飛ぶものだと思ってましたが、 
コンパイラは、} の方に飛ぶようにつくるのですね。 for でもそうなのか。 頭に飛ぶものと思ってました
0489デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:55:44.09ID:FAIH8E2E
> ret = ret; <---- ここ !

ちなみにコレ
なにやってんの
0492デフォルトの名無しさん
垢版 |
2018/10/06(土) 18:10:02.18ID:FAIH8E2E
要するにになにもしたくなかったワケか
だったら余計なことしないで空文でいい
0493デフォルトの名無しさん
垢版 |
2018/10/06(土) 18:12:36.42ID:5XBjQGBu
>>492
ありがとう。 } の直前にジャンプしたかっただけです。 で、 label: と コロンでとめるとエラーになったので
ダミー文と入れました。 やってないけど、 セミコロンだけでよかったのですね
0494452
垢版 |
2018/10/09(火) 17:17:22.89ID:JymqGv4u
>>関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書いてしまいましたが誤りでした
正しくは、以下でした

Cプログラミング診断室
第2章 これでもプロ ポインタ
より
C言語中級レベル認定問題
関数へのポインタの配列とはどういうもので、どういう使い方があるでしょうか。

藤原先生の名誉のためにも訂正しておきます
スレ汚し失礼しましたm(_ _)m
0495デフォルトの名無しさん
垢版 |
2018/10/11(木) 17:09:46.75ID:6FntMPLi
std::tuple<hoge, fuga>
std::tuple<hoge, hage, ...>
std::tuple<fuga, hoge, hage, ...>
という具合に<>の中が何パターン(ほぼ無限)もある場合

template<typename T>と
std::tuple<T>
で代表させるみたいなこと出来ますか?

出来るなら
template<typename *>
std::tuple<*>
こんな感じが嬉しいです
0497デフォルトの名無しさん
垢版 |
2018/10/11(木) 17:26:33.96ID:6FntMPLi
ありがとうございます!
勉強してきます!!!
0498デフォルトの名無しさん
垢版 |
2018/10/12(金) 10:08:09.64ID:46Wm2YVF
MSVC 専用らしいのですが
_For_each_tuple_element の引数として指定されたλ関数の中で
_For_each_tuple_element を呼ぶ前に宣言した変数にアクセスするにはどうすれば良いですか


int i = 0;
std::_For_each_tuple_element(tuplevaluse, [](auto&& v){
fprintf(stdout, "%d: ", i++); // ← ここの i でエラー
fprintf(stdout, "%d\n", (int)v);
});
0499デフォルトの名無しさん
垢版 |
2018/10/12(金) 10:21:25.26ID:46Wm2YVF
解決しました

int i = 0;
std::_For_each_tuple_element(tuplevaluse, [&i](auto&& v){
fprintf(stdout, "%d: ", i++);
fprintf(stdout, "%d\n", (int)v);
});
0500デフォルトの名無しさん
垢版 |
2018/10/14(日) 10:27:05.28ID:eBgdRWtd
VC++6.0 MFCを使っています。

数秒間、処理を止めたいのですが、C言語のsleepという関数がありますが、これを使うのが一般的なのでしょうか
心配なのは、これを使って10秒とか時間を止めると、その間CPU時間が100%になったりしないのかという点です。
MFC環境で上手に処理を止めるのにはどうしたらいいのでしょうか。 OnTimerを使うとかしないとダメですか
0501デフォルトの名無しさん
垢版 |
2018/10/14(日) 11:05:53.59ID:eBgdRWtd
自己解決
MFCで、sleepという関数は使えませんでした
その代り、Sleepという関数が提供されていました
0502デフォルトの名無しさん
垢版 |
2018/10/14(日) 12:48:33.48ID:gKOdVSwA
>>501
MFCに限らず、UIスレッドの関数内で10秒もSleepで待つのはダメ。
そのウィンドウをユーザーが操作したら「応答なし」と表示されてしまう。

OnTimerで定期的に監視し続けるなり、
独自のメッセージを送って終了を通知するなりしないと。

もちろん、その間は
×ボタンを含めてすべてのコントロールを操作不可にしたり、
ユーザーが閉じられない別ダイアログをモーダルで出したりする対応も必要。
0503デフォルトの名無しさん
垢版 |
2018/10/14(日) 13:21:17.04ID:G4e8iFcg
いまどきのSleepは他プロセスを止めたりはしないぞ
0506デフォルトの名無しさん
垢版 |
2018/10/14(日) 16:30:02.81ID:nFpB0nHw
本来ダメなんだけどエクセルとかも盛大にUIスレッドで長期間マクロ実行したりするからね
数秒くらいならいいんじゃないの
金とってプログラム作ってる風でもないし
0507デフォルトの名無しさん
垢版 |
2018/10/14(日) 16:40:58.09ID:qQZu4oFT
>>506
Sleepで待ちたくなるということは、処理自体は
別スレッドなり別プロセスなりで動いているのだと思ったが
0508デフォルトの名無しさん
垢版 |
2018/10/14(日) 16:46:29.33ID:nFpB0nHw
俺はメインスレッドでそのまま何かやってると感じたな
sleep の挙動を5ちゃんで質問する人がすでにワーカスレッドを使ってるとは全く想定しなかった
0511デフォルトの名無しさん
垢版 |
2018/10/15(月) 07:46:47.81ID:PSoKrj1X
なんかえらい反感買っちゃったな
Sleep知らなくてもワーカスレッドは使ってるだろうという>>507の方が普通の感覚なのかな
0512デフォルトの名無しさん
垢版 |
2018/10/15(月) 10:28:47.73ID:/DZZgAIK
みなさん判りましたか
条件後出しするとこうなります
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況