07/12/18 15:54:40
C#でC++よりも効率のいいデバイスドライバーって作れるの?
725:デフォルトの名無しさん
07/12/18 17:18:28
ここC++/CLIスレなんだけど
726:デフォルトの名無しさん
07/12/18 17:24:39
C#は.NETを必要とする代わりに便利な環境を提供するものだけど
C++/CLIはどうしても.NETが必要な人のためのものだからな
727:デフォルトの名無しさん
07/12/19 01:40:55
.NETが必要なこと自体に遭遇したことがない
728:デフォルトの名無しさん
07/12/19 10:06:30
リッチなGUIを簡単に作れるのは魅力的なんだが
729:デフォルトの名無しさん
07/12/19 11:23:58
.NETは美しいんだよ。
APIのドキュメントと長時間睨めっこしなくて済む
730:デフォルトの名無しさん
07/12/19 11:39:59
それなんてDelphi/VCL?
731:デフォルトの名無しさん
07/12/19 14:20:22
某は見苦しさを極めてるからなw
732:デフォルトの名無しさん
07/12/25 21:21:14
>>724
そもそもC#で作ったデバイスドライバなんてあるの?
733:デフォルトの名無しさん
07/12/26 00:46:25
マネージド、アンマネージドのクラスや配列の解放について質問があります。
なるべく使い終わったクラスを即時メモリ解放したくて、
delete しているのですが、タスクマネージャで確認しても、解放しているようには見えません。
マネージもアンマネージも、deleteしたタイミングでメモリ解放されるのでしょうか?
それとも、マネージはGCに頼るしかなく、アンマネージはdeleteのあるタイミングでメモリ解放されるのでしょうか?
734:デフォルトの名無しさん
07/12/26 00:50:47
アンマネージドでも確保したメモリをプールして使いまわしてるだけだから、
deleteしたからといって、即座にメモリがOSに返還されるわけではないよ。
735:デフォルトの名無しさん
07/12/26 09:49:21
既定の new や malloc から先はどうやってるのか
追いかけたことないけど,「必要なら持っていっても
いいよ」っていうマークでもつけておいて必要に応じて
OS が回収できるようにしているのかな?
736:デフォルトの名無しさん
07/12/26 11:36:14
newやmallocはHeap系APIに丸投げでねーの?
737:デフォルトの名無しさん
07/12/26 12:43:27
>>736
ん?システムコールに丸投げ?
もっと,こう,自前でヒープを管理していると思うんだけど.
738:デフォルトの名無しさん
07/12/26 12:50:54
>>737
ちょいと階層は深いけど最終的にはそうなってるようだね>VC2005で確認。
そうなると500KB以上は個別にVirtualAlloc/VirtualFreeで、
小さいのは一元管理で縮小せずに再利用だろう。
もしかしてLINKオプションの/HEAPオプションは使われてないかも?
739:デフォルトの名無しさん
07/12/26 18:04:01
>>737
Win32APIはシステムコールではないよ。
Windowsのシステムコールは非公開でげすよ。
740:デフォルトの名無しさん
07/12/26 18:06:00
URLリンク(ja.wikipedia.org)
システムコールとは、オペレーティングシステム (OS)
(より明確に言えばOSのカーネル)の機能を呼び出すために使用される機構のこと。
実際のプログラミングにおいては、OSの機能は関数 (API) 呼び出しによって実現されるので、
OSの備える関数 (API) のことを指すこともある
741:デフォルトの名無しさん
07/12/26 21:10:12
>>739
Windows においてはシステムコールはサブシステムの裏に隠れて
いて直接呼び出すことはできないってこと?
Win32 API って POSIX レイヤと同じレイヤ?
742:デフォルトの名無しさん
07/12/27 15:37:07
基本的に同じ。ただ、GDI関係は性能の都合でWin32 APIはカーネルのほうまで突っ込んでいたはず。
これをシステムコールというのかはわからないけど、
そういうサブシステムの下に位置するネイティブAPIと呼ばれるがNTDLL.DLLから公開されている。
9xの場合はVxDをDeviceIOControlで呼び出すことがシステムコールに相当するといっていいと思う。
743:デフォルトの名無しさん
07/12/27 22:22:48
ファイナライザって要らない子?
744:デフォルトの名無しさん
07/12/27 22:31:21
Disposeし忘れたときに必要
745:デフォルトの名無しさん
07/12/31 00:50:26
C++/CLIくだすれって消えてる?あるならそちらに誘導してもらえれば嬉しいです(’・ω・)
おとなしくC#いけって話かなぁ。。。
URLリンク(homepage3.nifty.com)
ここを参考にしながらForm1_Paintが呼ばれたときに
DrawlineとかDrawRectangleで描画するプログラム書いてるんですが、
その処理がとても重いので(他の理由もあるのですが)ボタンを押されたときだけ画面を更新するようにしたいんですが、どうしたら良いでしょうか。
(Form1_Paintだとウィンドウの移動などでも更新されてしまうので、それを避けたいということです。)
button1ってボタン作って、button1_Clickに全部書きゃ良いじゃんとか思ったんですが、
引数が(System::Object^ sender, System::EventArgs^ e)なのでe->Graphicsを使えなくて困ってます。
746:デフォルトの名無しさん
07/12/31 05:08:13
メンバにBitmapとか描画バッファを用意して
button1_Clickで描画、PaintでBitBltが妥当じゃね?
747:デフォルトの名無しさん
07/12/31 10:55:55
>>745
Form.CreateGraphicsは?
.NET使うならC#は読み書きできるようになった方がいろいろ便利だよ
748:デフォルトの名無しさん
08/01/01 10:16:58
あけおめです。
>>746-747
レスありがとうございます。
まず>>747のようにbutton1_Clickに
Graphic^ g=CreateGraphics();
としてボタンでの描画は成功したんですが、今度はForm1_Paintが呼ばれたときに描画されたものが消えてしまったので
>>746の方法をとろうとしたんですが、ドキュメント見たりググったりしてもいまいち描画バッファ→画面のBitBltのやり方が
分からなかったので、
URLリンク(www.atmarkit.co.jp)
を見ながらpictureBox1を作って、
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g = Graphics::FromImage(pictureBox1->Image);
drawRandomWalk(g);
pictureBox1->Refresh();
}
こんな感じで解決しました。結果的には>>746の方法に近い?解決策となりました。
C#も勉強してみます(’・ω・)
ありがとうございました。
749:デフォルトの名無しさん
08/01/07 19:39:43
make_publicの使い方に詳しい方いますか?
ReleaseでDLLをBuildするとリンクエラーが発生します。
>libtest.obj : error LNK2022: metadata operation failed (80131195) : カスタム属性が適合しません: (0x0c00021b)。
>Stdafx.obj : error LNK2022: metadata operation failed (80131195) : カスタム属性が適合しません: (0x0c000261)。
Debugでビルドするとエラーが発生しません。
make_publicはStdafx.h(PreCompileヘッダ)に記述しているのですが、
どう対処すればよいのでしょうか?
750:デフォルトの名無しさん
08/01/13 10:05:33
ガベージコレクションが走るスレッドっていうのは、どのスレッドかは確定してないんですよね?
ということは、ガベージコレクションが走る際に呼び出すアンマネージリソースの処理は
スレッドセーフにしておかなければならないということかな?
具体的には参照カウントオブジェクトのラッパーをC++/CLIで作って.NETで使おうとしてるんだけど
Release関数をスレッドセーフにしなきゃならんのかなと。
(Interlockedにすればいいだけの話なんで、それ自体はどうってことないのですが)
751:デフォルトの名無しさん
08/01/13 11:45:06
ファイナライザスレッドは独立したスレッドなのでどのみちスレッドセーフは必要だろう
752:デフォルトの名無しさん
08/01/13 13:40:31
ファイナライザ中でthisに属するオブジェクトも生存は保証されていないしね
本当に最後の手段なんだから、基本的にはGC任せにしない方がいいよ
753:デフォルトの名無しさん
08/01/13 13:43:49
値型メンバは確実に生存してるぜ? その値型が持つ参照型はともかく
754:デフォルトの名無しさん
08/01/13 13:48:15
>>751-752
ありがとうございます。
明示的にDisposeてことになると思うんですが、
そうなるとDisposeしなければならないインスタンスを持つクラスがデータ構造の奥深くにあると
どんどんDispose呼び出しが感染していって親クラスのとこまで行ってしまいますよね。
面倒くさいなぁと思いつつも、仕方が無いなぁとも感じてるんですが
やっぱりそんなもんですかね…
755:デフォルトの名無しさん
08/01/13 23:19:17
アンマネージリソースを取り扱う以上、これは仕方ねっス。
頭切り替えるしかねっス。
ちなみにアンマネージリソース絡みでSafeHandleてのもあるんスが、
これの経緯とか調べるとさらに頭痛のタネが増えるのでオススメっす。
756:デフォルトの名無しさん
08/01/19 09:08:52
C++/CLIのメソッド引数に%をつけることについて質問があります。
マネージ型の配列や構造体をメソッドに渡すとき、”^”をつけますが、 この渡し方で配列や構造体の”ポインタ”が渡されると思っていました。
”^”の引数があるメソッドを持ったクラスライブラリをVBで参照したら “ByVal”となっていました。
ここで質問ですが、”^”でなく”^%”としなければ配列や構造体が 値渡し(配列全体がCopy?)になるのでしょうか?%をつける、 という概念がC++/CLIで現れたため悩んでいます。
できるならば 配列や構造体は値渡しでなく、アドレス渡し、配列渡しをしたいのですが・・・
757:デフォルトの名無しさん
08/01/19 09:13:22
^は参照型 そのまま渡すと参照をコピー
%はC++の&、C#のref/outに当たる参照渡し
「参照型 参照渡し」で調べればいいよ
758:デフォルトの名無しさん
08/01/19 09:54:02
>>757
ありがとうございます。調べてみました。参照型の^引数はアドレスをコピー、参照型の^%渡しはアドレスを参照渡しする、ということですね。
ということは参照型の場合、どちらの方法で渡してもパフォーマンスに大きな影響はないということでしょうか。
参照型と参照渡しの違いを理解しないといけないのですね。
759:デフォルトの名無しさん
08/01/19 10:52:27
.NETで参照渡しはあんまり使わないよ
参照で渡すことが多いんだったら初めから参照型にする
760:デフォルトの名無しさん
08/01/20 22:59:01
TryParseとかあるじゃん
761:デフォルトの名無しさん
08/01/22 21:33:21
スレ立ったのが2006年とかC++/CLIは使われてないの?
今からやるならC#のがいいかね?
762:デフォルトの名無しさん
08/01/22 22:06:34
アンマネージC++もC#も使えるようになった上で、
もしも必要に迫られたときにやっと登場する言語だからね
763:デフォルトの名無しさん
08/01/22 22:54:30
俺は間違っても#なんか使わん。意地でCLI
764:デフォルトの名無しさん
08/01/22 22:55:23
シーナンバー
765:デフォルトの名無しさん
08/01/26 16:42:52
>>761
そりゃ今からやるならC#だな
それよりVB.NETがいいに決まってるけどw
少なくともC++/CLIなんて論外だ
まあ.NETやること自体が間違いかもしれないが・・・
766:デフォルトの名無しさん
08/01/29 01:51:49
なぜVBを推すのか
767:デフォルトの名無しさん
08/02/03 23:32:44
ref じゃないクラスで managed なクラスのイベント捕まえようとしてるのだけど
やり方がわからないので教えてください。
ref class hoge {
event EventHandler ^ev;
};
class hoge_wrapper {
hoge ^_hoge;
void OnHogeEv(System::Object ^o, System::EventArgs ^);
hoge_wrapper(hoge ^_hoge) {
this->_hoge = _hoge;
_hoge->ev += gcnew System::EventHandler (this, &hoge_wrapper::OnHogeEv);
}
};
こんなコードを書いているのだけど EventHandler のコンストラクターでC3364のコンパイルエラーがでて怒られます。
768:デフォルトの名無しさん
08/02/03 23:52:38
>767
そりゃ、混合型は駄目だろ
ネイティブはネイティブ、マネージドはマネージドで扱わないと
769:デフォルトの名無しさん
08/02/04 00:25:09
あ、hoge_wrapper::_hoge の型は
gcroot<hoge ^> _hoge;
って宣言してました。転記ミスです。
770:デフォルトの名無しさん
08/02/04 00:59:04
いや、そこもそうだけど、gcnew しているイベント・ハンドラにネイティブの
ポインタ this を渡してるだろ?
マネージドでイベントアダプタみたいな物を作ったら?
771:デフォルトの名無しさん
08/02/05 01:13:10
MAKE_DELIGATE っていうのを見つけて、試してみたら意図したとおりに動くみたいです。
中身を見てみたら 770 さんの言うとおりの動きなのかな?
とりあえず解決しましたー。ありがとです。