- 1 名前:デフォルトの名無しさん [2007/08/01(水) 06:23:28 ]
- Microsoft Foundation Classライブラリ専用スレです。
- 34 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 06:30:35 ]
- >>33
.NETってなーに?
- 35 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 06:38:50 ]
- .NET Frameworkのことじゃね?
でも.NET FrameworkってC++で使えるの?
- 36 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 11:43:23 ]
- >>33
まあ、単純で簡単な.NETに移っていくのはしょうがないんじゃね。 VSの機能も、明らかにC++よりC#に力入れてるし。 MFCがなくなることはないだろうけど、使う機会はゆっくり減っていくかと。
- 37 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:25:21 ]
- 組み込みプログラムとそのツールの作成の仕事が多いから
MFC+C++の形を保ってくれないと困る ソース流用できねーじゃん 基本理念(オブジェクト指向)が変わらないのに 新しい言語なんて無駄に作るんじゃねぇといいたくなる
- 38 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 13:50:40 ]
- C#やVB.NETは厳密にはコンポーネント指向
- 39 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 14:10:15 ]
- >>35
C++/CLI >>37 >組み込みプログラムとそのツール GUIとファイル処理、通信部でも作っとけば、 ちょっとした組み合わせと改造で事足りるんじゃないか? その程度だったら、2ちゃん回ってる時間を少し割けば、速効で作れるだろ VC、VBだろうが、OOPがどうとか目くじら立てるほどのもんかね? 組み込みでアーキテクチャやOSやらが変わったり、 実績のないボード動かしたりするほどの手間でもないだろ
- 40 名前:デフォルトの名無しさん [2007/08/19(日) 20:01:19 ]
- .netでのアプリを出荷したことないから何とも言えないが
客先から見たら、.NETであることによるメリットってなにもないよね? しかも、.netは遅いなんてことも浸透してるから・・・
- 41 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 00:32:37 ]
- 今までいろんなプログラム書いてきたが
MFCほどわからんもんはない
- 42 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 00:47:01 ]
- >>40
なんだろうなあれ? なんであんな糞動作するんだろか? スクリプトで動作してんのかな? Vistaといい動作の糞なアプリが多くなったな
- 43 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 06:16:33 ]
- >>42
糞動作の意味がわからん 中間言語で動いてるんだから初回起動は遅いのがあたりまえだろ もっさりしているが 異常動作してるわけじゃない さらにVistaをアプリと分類する頭も逝かれてるな
- 44 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:28:57 ]
- アンマネージドなのは好きになれないが、GUI周りの設計は嫌いじゃない。
- 45 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:31:23 ]
- アンマネージドじゃなくてマネージドだった
- 46 名前:デフォルトの名無しさん mailto:晒しage [2007/08/20(月) 11:31:13 ]
- >>42
>>42 >>42 >>42 >>42 >>42 >>42
- 47 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 11:38:51 ]
- >>40
ヒント 1年目マでも使える 開発期間 ASP.NET
- 48 名前:デフォルトの名無しさん [2007/08/20(月) 17:14:01 ]
- CWinApp* pApp = AfxGetApp();
if (pApp != NULL) return pApp->DoMessageBox(lpszText, nType, nIDHelp); else return pApp->CWinApp::DoMessageBox(lpszText, nType, nIDHelp);
- 49 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 22:29:14 ]
- >>43
やっぱ、もっさりしてるんじゃんw これが糞動作でなくてなんなんだと聞きたい 俺等は.Netをサポートしてバージョンをわざわざアップしてやるのに 動作はもっさりすんのか? お前等なんて一生もっさりしてればいいんだ
- 50 名前:デフォルトの名無しさん [2007/08/20(月) 22:36:34 ]
- CDC::SaveDCとCDC::RestoreDCって、
CDC::SelectObjectの戻り値を最後に戻す方法に比べて、 なにかデメリットってありますか? こっちのほうがずっと簡潔に書けると思うのだけど。
- 51 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:15:09 ]
- 一切合財保存するだろうから、必要なものだけ戻すよりは重いと思う。
でもまあ今時のPCならデメリットと言えるほどのものではないだろう。
- 52 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 20:45:43 ]
- 一ヶ所でやる事しか考えないなら
どっちでもいい
- 53 名前:デフォルトの名無しさん [2007/08/22(水) 12:37:48 ]
- >>51
やっぱりSaveDCとRestoreDCのほうが便利ですよね。 なんでこの方法って広く浸透していないんだろう。 卑怯な方法みたいに書かれているところもあったし。 >>52 これはどういうことでしょうか? SaveDCはスタック的に何回でもコールできるみたいですけど。
- 54 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 20:40:42 ]
- CDocumentでファイル開く処理を行った後、
CViewのOnDrawで再描画行いたいんですけど CView::GetDocumentのような GetViewみたいなの無いですか? OnDrawするような再描画コマンドでもいいです。
- 55 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 21:18:28 ]
- >>54
Viewの更新は、基本的にCDocument::UpdateAllViewsで通知する GetFirstViewPosition/GetNextViewを使って、 関連付けられたViewの取得もできなくはないけど。
- 56 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:47:13 ]
-
CMyView* pView = (CMyView*)AfxGetMainWnd()->GetActiveView(); pView->InvalidateRect(NULL, FALSE);
- 57 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:49:32 ]
- ドッキングウィンドウ難しい・・・orz
誰か詳しいページ知ってる人いませんか? コードGruruしかない?
- 58 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 14:55:47 ]
- MFCでドッキングは茨の道すぎるので
C#かBCBやりなさい
- 59 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:16:51 ]
- VC++2005にCWebBrowser2が無いのですが、
ダイアログに貼り付けたWeb Browserコントロールで 下記のようにNavigate2したいのですが、どうすればできるでしょうか? CWebBrowser2* wb = (CWebBrowser2 *)GetDlgItem(IDC_EXPLORER1); wb->Navigate2(url,NULL,NULL,NULL,NULL・・・);
- 60 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:34:59 ]
- >>59ですが、webbrowser2.hとwebbrowser2.cppを自分のプロジェクトへ追加することで解決しそうです
- 61 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 09:07:23 ]
- >58
MFCはドッキングツールバーがあるから ドッキングウインドウは簡単だけど?
- 62 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 14:57:46 ]
- >>61
なら教えてやれよ。
- 63 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 17:12:58 ]
- >>57
www.codeproject.com/docking/sizecbar.asp
- 64 名前:デフォルトの名無しさん [2007/08/31(金) 23:11:46 ]
- ドッキングも使えないとは・・・
- 65 名前:デフォルトの名無しさん [2007/09/01(土) 11:35:46 ]
- メモリマップドファイルについてですが
hMap = CreateFileMapping( hFile, 0, PAGE_READONLY, 0, 0, NULL); // MAP名なし if( hMap <= 0 ) { return false; } pPointer = (char*)MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0); // 全サイズ ↑のようにとするとhFileの内容が数1G超とかの場合、無謀になるような気がしますが MapViewOfFileEx等で数ページ分を部分的に割り当てていくしかないでしょうか? 1Gぐらいのファイルを試してみるとpPointerがNULLでした。
- 66 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 11:40:58 ]
- ここMFCスレですよ
- 67 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 12:14:26 ]
- CControlBarから派生する独自ドッキングバー作る時はかなり苦労したもんだ( ´∀`)
CDockBarとかCDockContextとかMSDNドキュメントにも載ってないしソース読むしかないもんな でも.NETだと最初からリサイズ可能ドッキングバーがあるんだよなー・・・なぜMFCも拡張せん!ヽ(`Д´)ノ
- 68 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 14:53:09 ]
- だってMFCだもん
- 69 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 17:48:35 ]
- MFCって今後は先細り?
.NETマンセー時代は来るんですか?
- 70 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 23:55:43 ]
- VS2008でVista向けMFCが出るみたい
- 71 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:18:12 ]
- MFC嫌いなんで廃れてくんねーかな
- 72 名前:デフォルトの名無しさん [2007/09/02(日) 00:23:31 ]
- なぜ?
.NETに比べたら100倍はいいと思うが?
- 73 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:28:05 ]
- >>71嫌いなんで氏んでくんねーかな
- 74 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 11:58:33 ]
- 例外でポインタを投げてくるのだけはどうにかしてほしい
- 75 名前:デフォルトの名無しさん [2007/09/02(日) 14:27:02 ]
- MFCに文句つける奴って単に使えないからだけだでょ?
現在、WINでGUIを作成するなら最強だと思う。 MFC無い時代はWINアプリを書くのはしんどかった。 最近C#なんてあるが、所詮インタプリタみたいなもんだからおもちゃw
- 76 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 15:24:09 ]
- お前は小学生か
- 77 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 15:43:12 ]
- .NET Frameworkに文句つける奴って単に使えないからだけだでょ?
現在、WINでGUIを作成するなら最強だと思う。 .NET無い時代はWINアプリを書くのはしんどかった。 昔MFCなんてものがあったが、所詮遺産みたいなもんだからガラクタw
- 78 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 00:22:51 ]
- MFCなんて時代遅れっしょ
- 79 名前:デフォルトの名無しさん [2007/09/03(月) 00:48:28 ]
- 次期VSでのMFCはかなりイイ
ダウンしてみ。 .NETなんざ使う気しなくなるぞ
- 80 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:45:52 ]
- 具体的に説明せよ
- 81 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 03:31:47 ]
- MFCってなにがどうなってんのかさっぱりわかんね('A`)
- 82 名前:デフォルトの名無しさん [2007/09/03(月) 11:39:24 ]
- ダイアログ上に数十のラジオボタンを配置したいのですが、
後のメンテナンス性を考慮して、ダイアログエディタではなく プログラム内の初期化処理にて生成したいのですが、 どういう関数を使えばいいのですか? よろしくお願いします。
- 83 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 12:42:25 ]
- >>82
CButton::Create
- 84 名前:82 mailto:sage [2007/09/03(月) 13:39:19 ]
- >>83
ありがとうございます。
- 85 名前:デフォルトの名無しさん [2007/09/03(月) 20:50:30 ]
- MFCって関数ポインタテーブルを使いたい「だけ」のためにC++使ってるんだろ?
C with class でしかないじゃん、C++と言うより
- 86 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:58:27 ]
- >>85
"C with class"であることの何が悪いのか知らんけど、クラス継承もあるし、オペレータオーバロードもある。 新しいMFCならテンプレートも使っているね。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:46:56 ]
- ダイアログ上にタブコントロールを配置してます。
ダイアログの表面色を塗りつぶしてるんですけど、 タブコントロールのタブが並んでいる部分の横の余った空間や、 タブコントロールの周囲の微小な背景がグレーのままです。 ここを塗るにはどうしたらいいんでしょうか。 塗るでもいいし、背景を透過にできればいいんですけど。
- 88 名前:デフォルトの名無しさん [2007/09/03(月) 23:53:19 ]
- rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200704/07040003.txt
場所は↑この方が説明してるのと同じです。
- 89 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:26:42 ]
- CHtmlViewでURLのドロップを受け取れるようにするにはどうすればいいの?
SetRegisterAsDropTarget(TRUE)をしてもダメだった
- 90 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:03:19 ]
- 中味はIEだし、特に何もしなくてもできるだろ
- 91 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:12:42 ]
- ちょっと興味あったんで試したけどデフォルトじゃ無理みたい。
WM_DROPFILESのイベントハンドラ追加のみで出来ました。 ショートカットだけじゃなく、htmlファイルやtxtファイルも表示可。
- 92 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:36:09 ]
- ウイザードでCHtmlViewにして、あとは何もいじらない状態でできたよ
- 93 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:33:26 ]
- >>90,92
通常のCHtmlViewではドロップできませんでした MFCのバージョンが関係あるかもしれないでしょうか? 自分はVisual Studio 2005 Standard Edition SP1を使ってます(WinXP&IE6) >>91 OnCreateでDragAcceptFiles()してWM_DROPFILESを追加したら、 ローカルのファイルはドロップできるのですが IEからのURLのドラッグ&ドロップはできませんでした・・・ IEからのURLのドロップをしたいのです
- 94 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 09:49:06 ]
- CDC::DrawDragRect()の説明には、座標は「論理座標」と書かれてるのに、
指定した位置にちゃんと描かれず、ネットで使用例を漁ってみたところ、 dc.LPtoDP(&rect); dc.DrawDragRect(rect, Last_draw_size, NULL, CSize(0, 0)); という記述がありました。 これに倣ってLPtoDP()してみたらちゃんと描かれたんですけど、 LPtoDP()するということはデバイス座標ですよね? MSDNの「論理座標」というのはどういう意図なんでしょうか? CDC::Rectangle()のほうにも論理座標と書かれていて、 こっちはLPtoDP()は必要無いんですけど。
- 95 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:55:19 ]
- >>94
MSDNの説明が間違っているな、これ。英語版でも駄目だな。 VS2005のCDC::DrawDragRectのコードだと、 矩形描画の範囲を指定するのにSelectClipRgnを使っているが、 この関数はデバイス単位での指定を仮定しているにも関わらず、 単位変換無しでそのまま渡している。
- 96 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:49:14 ]
- mfc(VC++ 2005)で開発をしているのですが、
ステータスバーをスレッド中から参照しようとすると、 Assertion Failedで怒られてしまいます。 ダイアログに変数で CStatusBar m_statubar を追加して OnInitDialog でCreate、ペインの初期化を行い ダイアログのコンストラクタで外部変数で定義した CStatusBar *m_sb に m_sb = &m_statusBar でアドレスを渡してスレッドで参照しているのですが どこがいけないのでしょうか?
- 97 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:55:33 ]
- >>95
解析情報ありがとうございます。 やっぱりCDC::DrawDragRect()ってデバイス単位で渡すのですよね。 昔からある関数なのにドキュメント修正すらされてないのか…。
- 98 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:59:24 ]
- たまたま指摘が無かったんじゃね?
ちゃんとMSに言えば多分直してくれるよ。
- 99 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:11:21 ]
- >>96
メインスレッド以外からコントロールを操作してはいけないからと思われ。
- 100 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:13:46 ]
- >>99
msdn2.microsoft.com/ja-jp/library/h14y172e(VS.80).aspx
- 101 名前:100 mailto:sage [2007/09/06(木) 00:14:51 ]
- アンカー間違えた、ごめん。
99じゃなくて96宛です。
- 102 名前:96 mailto:sage [2007/09/06(木) 00:47:54 ]
- >>99 >>100
スレッドから参照できないんですね。 ということで、タイマーで監視することにしました。 ありがとうございました。
- 103 名前:デフォルトの名無しさん [2007/09/06(木) 01:28:16 ]
- >>102
作り方によってはタイマー監視でもいいけど、同期オブジェクト使った方がいいかも スレッドプログラミングをタイマーで監視するプログラムは安易でいいけど嵌ることもあるから
- 104 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 01:32:44 ]
- あ、スマン96のようなステータスバー監視だったら
タイマーで良いや
- 105 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 07:34:25 ]
- >スレッドプログラミングをタイマーで監視するプログラム
何を監視するんだか。
- 106 名前:デフォルトの名無しさん [2007/09/06(木) 08:20:53 ]
- >>94
さぁ、ドキュメントのフィードバックをしよう
- 107 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:14:58 ]
- VC++ 2005, OSはXPProを用いているものです。
DLLを作成し、そこからAfxBeginThreadでスレッドを複数立ち上げているのですが、 メモリリークが起こってしまいます。 同様のコードをDLL経由でなく、EXEから直接動かすとリークしません。 恐らく、何らかの初期化処理が足りてないためと思っているのですが、心当たりのある方がいらっしゃいましたら、教えてください。 //--- 以下ソース #pragma once #include "TestThread.h" class CThreadManager { public: CThreadManager() { m_pThreads = NULL; } virtual ~CThreadManager() { delete [] m_pThreads; } void Run() { if (m_pThreads == NULL) {m_pThreads = new CTestThread[50];} for (int i = 0; i < 50; i ++) { if (m_pThreads[i].IsEnable()) { m_pThreads[i].SetEnable(FALSE); m_pThreads[i].Run(); return; } } } private: CTestThread* m_pThreads; };
- 108 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:15:43 ]
- //続き
#pragma once class CTestThread { public: CTestThread() { m_pThread = NULL; m_bEnable = TRUE; } virtual ~CTestThread(void) { EndThread(); } void Run() { EndThread(); m_pThread = ::AfxBeginThread(TestProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); if (m_pThread != NULL) { m_pThread->m_bAutoDelete = FALSE; m_pThread->ResumeThread(); } }
- 109 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:16:15 ]
- //続き
BOOL IsEnable() {return m_bEnable;} void SetEnable(BOOL bEnable) {m_bEnable = bEnable;} private: void EndThread() { if (m_pThread != NULL) { m_bEnable = -1; ::WaitForSingleObject(m_pThread->m_hThread, INFINITE); delete m_pThread; m_pThread = NULL; } } static UINT TestProc(LPVOID pParam) { for (int i = 0; (i < 50) && (((CTestThread*)pParam)->m_bEnable == FALSE); i ++) ::Sleep(5); ((CTestThread*)pParam)->m_bEnable = TRUE; return 0; } CWinThread* m_pThread; BOOL m_bEnable; };
- 110 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:16:58 ]
- 以上です。
108,109は一つのファイルを分割しています。 それと、掲示板に登校するサイズを減らすためにヘッダファイルのみで書いてみました…… よろしくお願いします。
- 111 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:44:11 ]
- >>107に追加です。
CThreadManager::Run(); 関数をタイマーで何回も呼ぶと、どんどんメモリが消費されていくという現象です。 確認は[管理ツール]→[パフォーマンス]から行い、一日ほど回し続けました。
- 112 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:28:50 ]
-
初心者です、質問させてください。 OnFileNewなどMFCが用意してくれた関数の中身(=ソースコード)って 見る事ができないのでしょうか? もしできるのなら、その方法を教えてください。 よろしくお願いします。
- 113 名前:デフォルトの名無しさん [2007/09/09(日) 00:55:01 ]
- 初心者を自称する人がMFCのソースコードが読めるとでも?
- 114 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:54:18 ]
- >>107
もっと簡素化したソースで検証したほうがいいんでねえの? あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、 メモリリークが発生しているかどうかをどのように見極めているとか、 メモリリークは、1スレッドあたりどの程度発生しているとか、記載すべきことがあるんでねえの? >>112 どのクラスのOnFileNewだかしらねーけど、MFCのソースはインストールされてんの? されてんなら検索すればいいだろう。 されてねーならインストールすればいいだろう。
- 115 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:56:48 ]
- 検証方法は>>111に書いてるつもりなんじゃね?
- 116 名前:112 mailto:sage [2007/09/09(日) 02:15:39 ]
- >>114
「OnFileNew」をキーワードに、下記フォルダを検索したら探せました。 ありがとうございました!! C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc
- 117 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:24:10 ]
- WIN32開発、java、C#とやってきて
最近MFCを始めました。 MFCってすごく難しく感じます。 実際どうなんですか?
- 118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:25:59 ]
- >>117
あなたにとって難しい。それだけのことです。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:16:30 ]
- >>117
平然と並列でないものを並べられると、頭がグラグラする。 漢文、英語、中国語とやってきて、 最近2ch語を始めました。 2ch語って凄く難しく感じます。 とかそんな感じか?
- 120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:24:08 ]
- とりあえず、107のソース使って、dllとexeから実行してみたけど
リーク検出できなかったな 1日実行してみて、どれくらいリークしてるの?
- 121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:17:53 ]
- >>117
win32の経験があるのなら、mfcはそんなに難しくないと思うが。
- 122 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:15:43 ]
- フレームワーク「郷に入っては郷に従え」
の考え方ができればいける。
- 123 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:48:24 ]
- >>114
もっと簡素化したソースについては今から作る事にします。 >あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、 何らかの初期化処理というのは、単にスレッドを起こす前に、おまじない的なものが必要なのかと思って書いただけです。 また、DLLMain関数はMFC側で作っているものを使っているので、こちらの初期化処理については不明です。 >メモリリークが発生しているかどうかをどのように見極めているとか、 管理ツールからパフォーマンスモニタを開きまして、そこでプロセスを選択して、15秒おきにワーキングセットを監視しています。 直接のメモリリークではないと思いますが、exeとの比較により、ワーキングセットの増え方があまりに異常なので問題かと…… >メモリリークは、1スレッドあたりどの程度発生しているとか 1スレッドあたりのリークは調べていませんが、15秒おきのワーキングセット増加値は平均で23kBほどです。 これは、CThreadManager::Run();をタイマーで、90msごとに動かした結果です。 一日動かしたときは、これよりも間隔をあけて1000msでやりました。割合は減りますが、同じようにリークします。 なお、1000msで一日動かしたときの、一日のリーク量は1MBほどです。 >>120 1000ms間隔で1MB程度です。 ちなみに、事情がありまして、DLLエクスポートの部分は少々特殊かなぁ……と。 そこのソースも書いてみます。
- 124 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:49:25 ]
- // エクスポート部分のソース。
__declspec(dllexport) void CreateThreadManager(DWORD** ppObject) { *ppObject = (DWORD*)(new CThreadManager()); } __declspec(dllexport) void RunThread(DWORD* pObject) { ((CThreadManager*)pObject)->Run(); } __declspec(dllexport) void DeleteThreadManager(DWORD* pObject) { delete (CThreadManager*)pObject; } //アプリ側の使用部分 #include "stdafx.h" #include "ThreadTest.h" #include "ThreadTestDlg.h" #include "ThreadDll.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CThreadTestDlg::CThreadTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CThreadTestDlg::IDD, pParent) { m_pManager = NULL; m_nTimerEvent = 0; } // 続く
- 125 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:50:08 ]
- //続き
BEGIN_MESSAGE_MAP(CThreadTestDlg, CDialog) ON_WM_TIMER() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CThreadTestDlg::OnInitDialog() { CDialog::OnInitDialog(); ::CreateThreadManager(&m_pManager); m_nTimerEvent = SetTimer(1, 89, NULL); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } void CThreadTestDlg::OnTimer(UINT_PTR nIDEvent) { if (m_pManager) { RunThread(m_pManager); } CDialog::OnTimer(nIDEvent); } void CThreadTestDlg::OnDestroy() { CDialog::OnDestroy(); if (m_nTimerEvent != 0) { KillTimer(m_nTimerEvent); } DeleteThreadManager(m_pManager); }
- 126 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:51:26 ]
- てな具合で、動かしています。正直な話タイマー間隔をこのぐらい短く設定すると一日は多分動きません。
もうちょっと空けてやらないと、マシンスペックの弱いPCだと落ちてしまうのではないかと……
- 127 名前:デフォルトの名無しさん [2007/09/09(日) 13:59:38 ]
- >>122
そうですか? BCBやVC#と比べると何をどうしていいのかまったく分からん
- 128 名前:デフォルトの名無しさん [2007/09/09(日) 14:11:26 ]
- >>127
>何をどうしていいのかまったく分からん たとえば、何をどうしたいのかな? よほど難解なことをしようとしてるのか。それともごく標準的なGUIツールも作れないのか。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:18:07 ]
- >>127
ぶっちゃけ、すぐ上のサンプルコードは動かせる?
- 130 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:10:07 ]
- >>126
とりあえず、そのもたないと思われる状態で一日動かしてみるべき
- 131 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 10:16:49 ]
- CObjectから派生させていないデータクラスでも
Serializeでないファイル読み書きに CArchiveを使ってしまってよいものでしょうか? virtual void LoadData(CArchive& ar); virtual void SaveData(CArchive& ar) const; こんな感じのメンバ関数を用意しようかと思っているんですけど。 それとも、CFile*を引数にしてしまうべきですか?
- 132 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:42:47 ]
- >>131
シリアル化にIMPLEMENT_SERIALを使わないなら、 CObject派生の意味は殆ど無いし、良いんじゃないかな。 結局は単純なバイト列の読み書きなのだし。
- 133 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:47:20 ]
- >>132
ありがとうございます。 自作データクラス群は大元の親クラスが純粋仮想クラスで、 また、自分自身がCObjectから派生することに慣れていないため、 この形のままCArchiveだけ使えないかなと思いました。 このデータクラス群の一つが内部でCArrayのメンバを持っているのですが、 これを保存するためにCArray::Serializeを呼ぼうとすると、 SaveDataはconstにはできないですね…。 まぁconstを取り外してしまえば、とりあえず動きそうですが、 SaveDataの中でMFCクラスメンバのSerializeをコールというのが かなりまずい構造なのかなぁ。
- 134 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 10:05:42 ]
- >>133
MFC - 概念 - シリアル化 - シリアル化 : オブジェクトのシリアル化 - アーカイブを通じた CObject の格納と読み込み
|

|