C#, C♯, C#相談室 Part51at TECH
C#, C♯, C#相談室 Part51 - 暇つぶし2ch822:デフォルトの名無しさん
09/03/19 09:26:04
ManagedDirectXつかってシューティングを作っているのですが、
何らかの描画命令(たとえばfont.DrawText)を1フレームに300回くらいやると、
描画命令の増加に従って徐々にFPSが落ちていきます。
描画命令をコメントアウトすると治るのでそれ以外が原因になっているとは考えにくいです。
また、テクスチャの有無やアルファの有効無効、頂点数にも影響されないようです。
デバイスの初期化はこうやっています
Direct3D.PresentParameters param = new PresentParameters();
param.Windowed = true;
param.SwapEffect = SwapEffect.Discard;
param.MultiSample = MultiSampleType.EightSamples;
device = new Direct3D.Device(0,Microsoft.DirectX.Direct3D.DeviceType.Hardware, wind,CreateFlags.HardwareVertexProcessing, param);
device.RenderState.CullMode = Cull.None;
device.RenderState.Lighting = false;
device.RenderState.AlphaBlendEnable = true;
device.SetTextureStageState(0, TextureStageStates.AlphaOperation, (int)Microsoft.DirectX.Direct3D.TextureOperation.Modulate);
device.SetTextureStageState(0, TextureStageStates.AlphaArgument1,(int)Microsoft.DirectX.Direct3D.TextureArgument.TextureColor);
device.SetTextureStageState(0, TextureStageStates.AlphaArgument2,(int)Microsoft.DirectX.Direct3D.TextureArgument.Current);
device.RenderState.SourceBlend = Blend.SourceAlpha;
device.RenderState.DestinationBlend = Blend.InvSourceAlpha;
D3DTex.Direct3DDevice = device;
verts = new CustomVertex.TransformedColoredTextured[10];
vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColoredTextured), 5000, device, 0, CustomVertex.TransformedColoredTextured.Format, Pool.Managed);
sprite_ = new Sprite(device);
ClientSize_ = wind.ClientSize;
どうかご教授願います。

823:デフォルトの名無しさん
09/03/19 11:09:17
多数の描画すれば、描画待ちでフレームレートが
悪化するのは、この手の処理では常識だと思います。

824:デフォルトの名無しさん
09/03/19 11:12:52
あとfont.DrawTextは重い

825:デフォルトの名無しさん
09/03/19 11:36:57
>>823
それはそうなんですが、表示してるのはただのスプライト(4頂点)なんです。
C2DにGeforce8600GTをつんでいるのに400スプライトで15FPSもでないのできっと何かが悪いのだとは思いますが・・・。
スプライトの描画部はこうなってます。これより前にテクスチャの設定や頂点の設定があります。
Draw2Dは使っていません。

triは描画する三角形の数で四角いスプライトなので通常2を設定。
if (device == null) return;
GraphicsStream stm = vertexBuffer.Lock(0, 0, 0);
stm.Write(verts);
vertexBuffer.Unlock();
device.SetStreamSource(0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
device.DrawPrimitives(ptype, 0, tri);
cPolygon += tri;

826:デフォルトの名無しさん
09/03/19 11:46:11
スプライト一枚ごとにそんなことやってたら遅いに決まってる
可能な限り同じテクスチャでまとめて書き込んでまとめて描画しろ

827:デフォルトの名無しさん
09/03/19 11:46:41
GraphicsStream stm = vertexBuffer.Lock(0, 0, 0);
stm.Write(verts);
vertexBuffer.Unlock();

↑この処理を400回やってるなら重くなって当り前かと
DrawPrimitiveで描いてるって事はGRAMをロックしてんだろ?

何れにせよDrawPrimitivesを数百回呼び出したら重い
数百枚のスプライトをオンメモリ上に1つのプリミティブで作成しといて
CPU側で座標指定してDrawPrimitiveUpとかやれば大分違うと思う

Managed DirectXはよく知らないけど

828:デフォルトの名無しさん
09/03/19 11:48:20
DrawTextなどを300回って書いといてそりゃねーだろ

バッチ処理は基本だが、にしても遅すぎるな
マネージコードのGCが暴れている可能性もあるからCLRProfilerとかで要調査

829:デフォルトの名無しさん
09/03/19 11:48:51
お、便乗しよっと

「メモリのロック」の意味がよくわかりません
必要な呪文程度に思ってます
このロックとは具体的にはどういう動作をしてるんでしょうか?


830:デフォルトの名無しさん
09/03/19 11:51:28
>>826-827
なるほど。
DrawPrimitivesの小口多数実行とDrawTextのやりすぎの複合要因だったんですね・・・。
テクスチャごとに1回ずつDrawPrimitivesを実行し、DrawTextの使用を見直してみます。

お答えくださった皆様、本当にありがとうございました。
改良に取り組んでみます!

831:デフォルトの名無しさん
09/03/19 12:06:36
>>829
そこ今から俺が触るからおまえら触るなよ!!
ってこと

832:デフォルトの名無しさん
09/03/19 12:14:45
少し便乗して

テクスチャ毎に描画というのは各頂点をGraphicsStreamに書き込んで

DrawPrimitives(PrimitiveType.TriangleList,0,(描画するテクスチャの場所*2));
で良いのですか?

833:デフォルトの名無しさん
09/03/19 13:12:45
>>831
ググればすぐにわかるだろうにw
URLリンク(www.stackasterisk.jp)


834:デフォルトの名無しさん
09/03/19 13:29:17
メモリのロックってマルチスレッド絡みの処理だったのかw
理解しました、ありがとう

835:デフォルトの名無しさん
09/03/19 20:17:12
下記いずれかのデータを大量にListに格納する場合、速度面等からいうと
どちらを選択した方が良いのでしょうか。格納するデータが増えることは
無いので拡張性を考慮する必要はありませんが、ググってもイマイチ分からず…。

・KeyValuePair<string,string>
・Key,Valueのstringを持ったクラス

836:デフォルトの名無しさん
09/03/19 20:30:13
Dictionary

837:デフォルトの名無しさん
09/03/19 20:32:15
なんで実測してみないんだ?

838:デフォルトの名無しさん
09/03/19 21:06:17
大量のデータから対象を素早く取り出したいならHashtable一択
.NET2.0以降のHashtable実装はDictionaryクラス

詳しく知りたいなら「データ構造とアルゴリズム」でぐぐればいいよ

839:デフォルトの名無しさん
09/03/19 21:16:08
まあ待てインデックスでのアクセスだけでいいのかも知れん
簡単にHashtable/Dictionaryを挙げるのは早計だ

840:デフォルトの名無しさん
09/03/19 21:19:07
>>839
>>835

841:デフォルトの名無しさん
09/03/19 21:22:40
純粋に>>835の質問に答えると後者だな
KeyValuePairは構造体だから出し入れ遅いよ

842:デフォルトの名無しさん
09/03/20 07:57:03
2147483647個以上の値を格納できるListみたいなのは
自作するしかない?

843:デフォルトの名無しさん
09/03/20 08:01:54
DB使えよwwww

844:デフォルトの名無しさん
09/03/20 08:12:59
本当にそんな物が必要なのかどうか検討するところからだな。

845:デフォルトの名無しさん
09/03/20 08:16:32
今List型で動いてるプログラムがあるんだが、
「メモリを50GB積むからこのデータを処理できるようにしてくれ」
って要求が来たんだ。

846:デフォルトの名無しさん
09/03/20 08:21:31
50Gとかw

847:デフォルトの名無しさん
09/03/20 08:43:44
単純計算で一オブジェクトあたり25b使えるわけだけど、
そのやり方は上手くいかないと思うわwww

IList<T>インターフェイスを提供するDBオブジェクト自作したほうがいいよwww

848:デフォルトの名無しさん
09/03/20 08:50:10
>>847
DBってディスクに書き込むイメージがあったんだがそうでもない?
金(50GBのメモリ分)がかかっても速いほうがいいんだが。

849:デフォルトの名無しさん
09/03/20 08:53:55
でかいRAMDISKつくってそこにDBおけばいいんじゃね?

850:デフォルトの名無しさん
09/03/20 08:57:42
DBについて勉強してくる
ありがと。

851:デフォルトの名無しさん
09/03/20 11:43:19
でもどっかの企業が全部オンメモリにするデータベースを運用しているっていう話を聞いたことがある。

852:デフォルトの名無しさん
09/03/20 11:44:45
そりゃおらくる

853:デフォルトの名無しさん
09/03/20 11:54:42
SQLiteやMySQLがオンメモリモードもってたとおもった。

854:デフォルトの名無しさん
09/03/20 12:45:42
配列なら添え字にlongが使える。
このため64bitの.NET Frameworkなら4GB越えの配列を扱える。
32bitの.NET Frameworkでもlongが使えるが、intの範囲を使い切る前にmemory不足に陥る。
64bitの.NET FrameworkならListなどのコレクションもトータルで4GB以上使えるが、
添え字がint限定なのでそれが上限になる。


855:デフォルトの名無しさん
09/03/20 13:51:31
すべてのユーザーが毎回50GB相当のデータを要求するわけではないんでしょ
OSのディスクキャッシュとかDBのメモリキャッシュに50GBメモリを活用してもらえば、
十分なパフォーマンスが出ると思うがね

856:デフォルトの名無しさん
09/03/20 14:23:45
>>855
十分なパフォーマンスが要件ではなく、
メモリで動作することなんじゃね?
要件定義を間違えるとそうなる。

857:デフォルトの名無しさん
09/03/20 14:41:19
しかし、仕事でDBを使うはいつものことだが、21億件のデータを突っ込んだことはないなw
一体何をしようとしてるんだ。

858:842
09/03/20 14:56:58
シミュレーション系です。

859:デフォルトの名無しさん
09/03/20 21:46:13
あー・・・ってそういうのもC#でやるもんなのか

860:デフォルトの名無しさん
09/03/20 21:51:47
ものにもよるだろうけど生産性との兼ね合いでそれもありじゃね?
まぁ自分的にはF#を使いたいと子だが

861:デフォルトの名無しさん
09/03/20 22:06:16
要素へのアクセスが添字だけですむなら、ただの配列の方がいいけどね。
普通にC#で書いたプログラムを、64bit環境で実行すればよい。

862:デフォルトの名無しさん
09/03/20 23:18:41
円をformの中でピンポンの様に動かしたいんですがどうすればよいのかご教授下さい。
周期的に座標を変化させていけばいいのか、他になにか方法があるのか・・
現在までのソースを示しておきます。
namespace circ
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();

}

void MainFormPaint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;

Pen pen = new Pen(Color.Green, 1);
g.DrawEllipse(pen, 60, 60, 30, 30);

}
}
}


863:デフォルトの名無しさん
09/03/20 23:40:59
何言ってんのお前?

864:デフォルトの名無しさん
09/03/21 00:08:26
>>862
Forms アプリなら Timer 使え。


865:デフォルトの名無しさん
09/03/21 00:52:33
Managed DirectXでコーディングしていrのですが、
ランタイムが入っていない場合の動作を定義するにはどうしたらよいのでしょうか?

FileNotFoundExceptionがthrowされることはわかったのですが、
どの時点でtry catchするべきかよくわかりません・・・。

using System・・・
(略)
using Microsoft.DirectX.Direct3D;
using Direct3D = Microsoft.DirectX.Direct3D;

    Direct3D.Device = null;
try
{
    Direct3D.Device = new Direct3D(なんとか);
}
catch(Exception e)
{
    System.Diagnostics.Debug.MessageBox.Show(e.ToString());
}
のような書き方をすると、
newをしくじった時のcatchはできるんですがDevice型自体を宣言できなった時にcatchするにはどのようにコーディングすればよいのでしょうか?

866:デフォルトの名無しさん
09/03/21 00:59:06
System.Reflection.Assembly.GetModule()

867:デフォルトの名無しさん
09/03/21 01:00:56
>>866
うおおおお
ああああありがとう!!!

868:デフォルトの名無しさん
09/03/21 01:33:51
>>862
ピンポンの動きはよく分からんが、
こんな感じのものを作りたい?
using System;
using System.Drawing;
using System.Windows.Forms;
namespace circ {
public class MainForm : Form {
Timer timer;
int x;
int y;
public MainForm() {
Paint += new PaintEventHandler(MainForm_Paint);
timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = 500;
timer.Enabled = true;
}
void MainForm_Paint(object sender, PaintEventArgs e) {
e.Graphics.DrawArc(Pens.Green, x, y, 10, 10, 0, 360);
}
void timer_Tick(object sender, EventArgs e) {
x = (x + 10) % Width;
y = (y + 20) % Height;
Invalidate();
}
}
}

869:デフォルトの名無しさん
09/03/21 10:09:56
>>868
ありがとう御座います。

動きの基本はそれです。
頂いたソースをベースに以下の仕様を考えています。

①スタート時、円は二個
②円の動きは直線
③スタート時二個円の直進方向は異なる
④壁にぶつかって跳ね返る
⑤二個の円がぶつかると円が1個増える。
⑥増えた円も直線動作を行う。
⑦繰り返し

円同士がぶつかる判定と円を増やしていくにはどうしたらいいんでしょうか?




870:デフォルトの名無しさん
09/03/21 10:18:29
1.お互いの円の中心が半径の2倍より近づいていたら衝突したと見なす
2.円をList<円>等で保持しておいて、衝突したら新しい円を追加する

871:デフォルトの名無しさん
09/03/21 11:10:16
なんつーかやりたいこととやれることのギャップが激しすぎるんじゃねーの?
全部ココで質問するつもりか?

872:デフォルトの名無しさん
09/03/21 11:14:12
このスレの連中はみんな初心者だろ

873:デフォルトの名無しさん
09/03/21 11:21:49
ふらっとすれもうなくなったんだっけ?

874:デフォルトの名無しさん
09/03/21 11:23:28
あるよ

ふらっとC#,C♯,C#(初心者用) Part39
スレリンク(tech板)

875:デフォルトの名無しさん
09/03/21 12:46:36
まさかとは思うがこれ宿題じゃないだろうな

876:デフォルトの名無しさん
09/03/21 12:47:58
宿題スレもあるね!

C#,C#の宿題片付けます。
スレリンク(tech板)l50


877:デフォルトの名無しさん
09/03/21 12:48:18
宿題じゃなく春休みの課題です

878:デフォルトの名無しさん
09/03/21 12:58:29
どう見ても宿題です。有り難うございました。

879:デフォルトの名無しさん
09/03/21 17:01:24
質問です。課題と宿題の違いってなんですか?

880:デフォルトの名無しさん
09/03/21 18:36:28
辞書ひけやゴミ

881:デフォルトの名無しさん
09/03/22 10:20:32
Tooltipの表示タイミングはそのままに、Tooltip.Showを使わずに
表示位置を制御する方法はないでしょうか。
↓でも議論されていますが、具体的な方法が分かりません…。

URLリンク(bbs.wankuma.com)

882:デフォルトの名無しさん
09/03/22 10:39:38
デフォルトだと、マウス位置がベースになるんだっけか。
となると、それを誤魔化すか、デフォルトの動作をフックして、
位置を指定して表示するしかないでしょ。

883:デフォルトの名無しさん
09/03/22 10:51:50
Showを使っても問題ないんですが、表示タイミングだけは
準拠したいという所なんです…。良い方法ないものでしょうか。

884:デフォルトの名無しさん
09/03/22 10:59:44
表示されるタイミングで、何かのメッセージが来るだろうから、
そいつを握りつぶしつつ、Show() すればいいんじゃね?

885:デフォルトの名無しさん
09/03/22 13:38:37
今ラジアンで角度を処理するクラスを作っているのですが、次のような動作をさせたいんです
1.値を代入したときは値を正規化してからいれる(負値だったら正値に、2π以上だったら2πで剰余算)
2.値を参照するときはそのまま参照
3.floatと同じように扱える
プロパティを使って実装すると次のようになりますが
  class RegularizedAngle
  {
    private float InAngle;
    public float Angle
    {
      get { return Angle; }
      set
       {
         //Angleが負値だったら正値に
         if (Angle < 0) Angle = PIx2 + Angle;
         //Angleが2π以上だったら2πで剰余算
         Angle %= (float)(Math.PI * 2f);
       }
    }
   }
これを普通のfloatと同じように扱いたいんです。
たとえば
RegularizedAngle Ang = (float)(Math.PI * 2f);   //すなわち6.28・・・の代入
Ang += 1;                         //代入したとき内部で正規化がおこなわれて1になる。

Ang += Ang;
//これで2になる?こんなかんじで見た目を組み込み型みたいにしたいんです。
しかし上記のプロパティをつかった方法だとアクセスするときに
Ang.Angle としなければなりませんし、宣言するときにはnewが必要です
組み込み型へのオーバーライドとかでできるのでしょうか?



886:885
09/03/22 13:54:58
>>885
ですがすいません。初心者スレに移動します。
>>885は無視してください。

887:デフォルトの名無しさん
09/03/23 01:16:27
C#でrubyのWWW::Mechanizeみたいなネットワーク系のライブラリありますか?

888:デフォルトの名無しさん
09/03/23 01:48:39
Mechanizeがネットワーク系とは思わないが、
あとC#じゃなくて.NETのコンポーネントだけど
System.Windows.Forms.WebBrowserが同等かな。
(もしくはWPFでそれに相当する物)
もちろんもっと低レベルのものもあります。

889:887
09/03/23 02:04:56
ありがとうございます
見てみます

890:デフォルトの名無しさん
09/03/23 18:23:08
Vista、VisualStdio2008で開発しているのですが、

hProcess.PriorityClass = ProcessPriorityClass.BelowNormal;

このように外部プロセスの優先度を変更しようとするコードをF5「デバッグ開始」で実行すると、エラーが発生し、
エラーメッセージは「アクセスが拒否されました。」となっています。
また、Ctrl+F5「デバッグなしで開始」で実行すると、問題なく動きます。
デバッグありでこのコードを動かすことはできないのでしょうか?

891:デフォルトの名無しさん
09/03/23 20:14:28
>>890
とりあえず VS(devenv) を昇格起動してみな

892:デフォルトの名無しさん
09/03/23 20:50:03
>>891
レスありがとうごいます。
昇格起動とは管理者権限で実行ということでしょうか?

AdministratorでログインしUACをオフ、devenv.exeを右クリックから管理者として実行を選択しましたが、
依然として「アクセスが拒否されました」になってしまいます。。。

893:デフォルトの名無しさん
09/03/23 20:58:17
>>892
ありゃ、とりあえず昇格すれば大丈夫だった気がするが。
まぁ駄目ならしゃーない。利便性落ちるけどこの手で。
プロジェクトの Properties
 → デバッグ
 → Visual Studio ホスティングプロセスを有効にする
のチェックをはずす。デバッグなしでいけるならこれでどうよ。
これで駄目ならセキュリティとかゾーンの設定見直してとしか
いえん

894:デフォルトの名無しさん
09/03/23 21:12:13
>>893
ホスティングプロセスのチェックを外したところうまく動きました。
現在のところホストプロセスを無効にしても、あまり問題はないようなのでこれでいこうと思います。
ありがとうございました。

895:デフォルトの名無しさん
09/03/24 00:31:48
APIスレの方が良いのかもしれませんが、教えて下さい。
WndProcでWM_KEYDOWNが発生したときに、
StrKey = new StringBuilder();
GetKeyNameText(msg.LParam, StrKey, StrKey.Capacity);
として押されたキー名を取得しているのですが、例えば「Ctrl+A」の時など
StrKeyにCtrlが入ってしまい、「A」が取得できません。
※AやShift+A、Alt+Aの時などは普通に拾えます。

WParamにはAを示す値(65)が入っているので何か方法はあるのでは
無いかと思っているのですが…。宜しくお願いします。

896:デフォルトの名無しさん
09/03/24 08:59:45
と、思いましたが、色々調べたところGetKeyboardStateで
Ctrl+A押下時のイベントが発生していないようでした。
Ctrl+B等は問題無いのですが…。TextBoxを継承しているのが問題なのか…。
もう少し色々調べてみます。失礼しました。

897:デフォルトの名無しさん
09/03/24 10:34:41
SelectAllのショートカットになってるからじゃ?
ShortCutsEnabledをFalseにしてみるとか

898:895
09/03/24 11:23:25
解決しました。↓が参考になりました。
URLリンク(www.atmarkit.co.jp)
結果的に、WndProcで行っていた処理をProcessCmdKeyに移すだけで
解決できました。失礼しました。

899:デフォルトの名無しさん
09/03/25 11:33:54
スレ汚しの質問すみません。
ブラウザの仕組みについてなんですが

ブラウザはどうやって同一タイミングでターゲットURLのHTTP情報、
さらにHTTPを解析してその先にある画像データの取得を一意的に行っているのでしょうか。
それをC#でIEコントロールを用いずに実現する方法はありますか?

たとえば今HttpWebRequestを使って試しているのですが
これでは1インスタンスにつき HttpWebRequest req = new HttpWebReqest.Create(url);
といった具合に一つのURLしか指定できません。

これによってサイト全体のHTTPをゲットする事が出来るのですが
1画像を取得しようと思った時には、その画像のURLをもって別インスタンスでCreateしなければならないんですが

一つのリクエストで全ての画像、サイト全体のHTTPを取得する方法はありませんか。
どなたか知恵をお貸しください。

900:デフォルトの名無しさん
09/03/25 11:40:52
無理
自分で作るか誰かが作ったのを使うしか。
サイト全部取得は場所によってはアクセス遮断されるかも。

901:デフォルトの名無しさん
09/03/25 11:49:55
一つのリクエストである必要性がどこにあるのか
って単に手抜きたいだけか

902:デフォルトの名無しさん
09/03/25 11:57:49
>>901
セッション管理を行っているサイトにリクエストした場合に
1セッションと認めさせたいからです。

903:デフォルトの名無しさん
09/03/25 12:01:39
ブラウザだって一つのリクエストで全部取ってきてるわけじゃないんだから
// KeepAliveで接続自体は一つかもしれんが
セッションとは関係ねーよ

904:899
09/03/25 12:03:05
というか、セッション管理をしているサイトというのは
やはりリクエストごとに別セッションと認識する物なんでしょうか。

要は1セッションと認めさせる事が出来、なおかつIEコントロールを使わない方法があれば
HttpWebRequest以外でもなんでもいいんですが・・・><;

905:899
09/03/25 12:04:35
>>903
ああ!やはりそうなんですね!
一つのリクエストじゃないのですねー。
keepAliveを使えば接続は一つになるのか~!ふむふむ!


906:デフォルトの名無しさん
09/03/25 12:41:57
取り敢えず適当なパケットモニタでも入れて送受信の様子を眺めてれば

907:899
09/03/25 13:40:04
>>906
なるほど・・・!
それは思いつきませんでした!
ありがとうございます!やってみます。

908:デフォルトの名無しさん
09/03/25 17:34:36
出来るだけ高速なファイル処理がやりたいのですが教えてください。
現在

[serializable]
public class A
{
 public int id;
 public datetime date;
 public long data;
 public long data2;
}

のようなクラスが存在し、これを50mSec程度の間隔で追記だけを行います。

このファイルには60万件のクラスAが入る可能性があります。
このとき出来るだけ高速に書き込む方法を教えて頂きたいのです。

また、この書きこんだクラスAの入ったバイナリファイル(60万件)を
例えば List<A> にデシリアライズ?してやるにはどうすればいいのでしょうか?

909:デフォルトの名無しさん
09/03/25 17:37:38
DB使えよ、ってのは駄目なのか

910:デフォルトの名無しさん
09/03/25 17:52:59
シリアライズせずにそのままバイナリデータを書き込んで、
読み込み時にbinaryReaderで読み込見ながらAddしたほうがいいような・・・

911:デフォルトの名無しさん
09/03/25 18:06:25
その程度のクラスなら、自前でバイナリシリアライズを実装すれば十分な速度が得られそうだ。
俺ならSQLite使うけど。

912:デフォルトの名無しさん
09/03/25 18:38:42
>>909-901
レスありがとうございます。

DBに関してはちょっと使えないのです。
>>910と>911を組み込んでみてチェックして速度が出る方を選んでみます。
ありがとうございました。



913:デフォルトの名無しさん
09/03/25 20:49:33
WebBrowserで表示しているコンテンツ内のボタンをクリックして
何かの動作が始まって、それが何かのエラーを起こして制御が
返ってこない場合があり、その結果アプリケーション本体がハング
アップしてしまうことがときどきありました。こういうケースでもその
状態から復帰して他の作業ができるようにしたいのですが良い方法
があれば教えて頂きたく。何卒よろしく。

914:デフォルトの名無しさん
09/03/25 20:57:08
WebBrowser内のコンテンツ上でボタンクリックなどでスクリプトか何か
なのか、あるいは返信待ちなのか、何らかの動作をしているときに
エラーが起きて制御が返って来ないまま、アプリケーション全体が
キーもマウスも受け付けなくなる時があり、対策をどうするべきかわからず
困っております。WebBrowserの外からそうした動作を監視していて
一定時間たったらどうなったか調べるなどといったことをするべきなのか、
あるいはなんらかの方法でそういう応答なしになった状態から復帰可能
なのか、わかっていないのですがアドバイスもしくはご解説をいただけたら
ありがたく。よろしくお願いします!

915:913, 914
09/03/25 21:03:02
すみません、JaneDoeStyle使っているのですが、書き込みした後で
何度かリロードして確認しても反映されておらず、しかも書き込みした
内容がエディタに残らなかったため、同じ質問を再度書いて送信して
こうなってしまいました。再掲申し訳ありません。

916:デフォルトの名無しさん
09/03/26 00:20:58
Formを半透明にすることなどは簡単に出来るのですが
半透明のグラデーションは出来ますか?
具体的に言うと、四角いフォームの場合一番上が不透明で
下に行くに従って透明度が増していく感じのフォームを作りたいのです。
よろしくお願いします。

917:デフォルトの名無しさん
09/03/26 01:08:16
Layered Window と UpdateLayeredWindow 使う方法が思いつくけど、
Form じゃ無理かなぁ。いや、無理というより意味がないというか…。

918:デフォルトの名無しさん
09/03/26 01:10:09
>>916
URLリンク(www.codeproject.com)

919:デフォルトの名無しさん
09/03/26 01:53:37
XmlReaderで現在の行数を取得することって出来ませんか?


920:デフォルトの名無しさん
09/03/26 03:25:35
質問です。
XmlSerializerを用いて、プログラム内のオブジェクト構造を元に
データの保存と読込を行っています。

このXmlSerializerで、同じオブジェクトを指す複数の参照変数を
シリアライズすると、シリアライズ化されたデータには
その参照数分のデータが重複して書き出されてしまいます。
このオブジェクトを、実際にシリアライズによって書き出されるデータは一つだけとし、
デシリアライズの際に参照変数群へ同じインスタンスへの参照が入るようにしたいです。

一応、あまり良い方法ではないと思うのですが、
複数参照されるオブジェクトは専用にシリアライズされるコンテナに全て格納、オブジェクトのID付けをし、
複数参照されるオブジェクトの変数と対に、そのオブジェクトのIDを持つシリアライズ対象なプロパティを定義し、
そのIDプロパティのsetterにおいてIDを元に、既にデシリアライズされているコンテナから該当オブジェクトを
取り出して変数にセットする、という方法をこれまで取っていました。

これを行うもっと正しい感じの方法はありますでしょうか?ヒントだけでも頂けると有り難いです。

921:デフォルトの名無しさん
09/03/26 09:02:37
>>920
とりあえずIXmlSerializableを実装して同じことを行えば隠蔽できる
もっと賢いやり方があったら俺も知りたいな

922:デフォルトの名無しさん
09/03/27 08:50:14
>>919
IXmlLineInfoにasキャストしてみる

923:デフォルトの名無しさん
09/03/27 10:40:24
>>914の件、どなたかアドバイスかヒントでもいただけたらありがたく。

924:デフォルトの名無しさん
09/03/27 10:46:18
32bit環境でつくってたプログラムのソースを64bit環境にもちこんでコンパイルして実行した場合、
挙動が異なったりする可能性はありますか?

925:デフォルトの名無しさん
09/03/27 10:48:34
ありまqす。

926:デフォルトの名無しさん
09/03/27 10:48:35
>>922
出来ました
しかしインターフェイスにキャストしてどうしてちゃんと行番号が取得できるんですか?

927:デフォルトの名無しさん
09/03/27 10:49:40
そうできてるから。

928:デフォルトの名無しさん
09/03/27 10:56:53
>>927
そうですか
有り難うございます。


929:デフォルトの名無しさん
09/03/27 11:00:32
class Foo {}
interface IHoge { void f(); }
class Bar : Foo, IHoge { public void f() {}}

Fooだと思ってるものがBarだったとしたら

930:デフォルトの名無しさん
09/03/27 11:03:12
>>924
同じソースならどちらの環境でコンパイルしても同じアセンブリが出来る。
どちらのCLRで動かすかが問題でそこで挙動が異なる場合がある。

931:デフォルトの名無しさん
09/03/27 11:04:16
>>930
ありがとうございます
intとか要注意ってことですか?

932:デフォルトの名無しさん
09/03/27 11:06:52
>>931
intは64bit環境でも32bitで固定。違いが出るのはIntPtr。

933:デフォルトの名無しさん
09/03/27 11:08:55
なるほど、ありがとうございました

934:デフォルトの名無しさん
09/03/27 20:21:50
>>932
製品開発統括部ブログだったかな?
WinXP64はintもlongで扱ってると書いていたよ。

935:デフォルトの名無しさん
09/03/27 20:29:52
>>934
URLプリーヅ

936:デフォルトの名無しさん
09/03/27 20:31:00
>>934
System.Int32が64ビットだっていいたいわけ?

937:デフォルトの名無しさん
09/03/27 20:31:56
>>935
前に探した時、アドレスが変わる前の記事だったようで見つからなかった

938:デフォルトの名無しさん
09/03/27 21:35:09
x64は64bit演算のほうが1バイト命令が長い、
ポインタ64、整数32でやる気満々のCPUだからそれはないと思うな。
03 c8      add   ecx, eax
48 03 c8  add   rcx, rax

VC++も int = long = 32bit, long long = 64bitだし。


939:920
09/03/28 03:16:33
>>921
亀レスですみません。
なるほとIXmlSerializableという手がありましたね、すっかり忘れていました。
これを使って解決する機構をGenericsを使って汎用化できるものとして作ってみたいと思います。

940:デフォルトの名無しさん
09/03/28 04:07:45
Windows.Formsについて質問です。

親子関係になっているコントロールにおいて、
親コントロールで子コントロールのイベントを捕獲する方法を知りたいです。
例えば、子コントロールの中にマウスカーソルがあって、
クリックされると通常は子コントロール側のClickedイベントが発生してしまいますが、
それよりも先に親コントロール側でClickedイベントが発生して欲しいのです。

暫定的な対処として、対象コントロールの子コントロール全てを再帰的に探索して
それらのイベントハンドラに、イベント発生を中継通知するメソッドを登録しています。
が、これでは結局通知のみであってイベント発生自体の順序は変わらないし、
またControlAddedイベントでも、追加されたコントロールに対して更に処理を行っており、
こんな力技な方法、絶対間違っているのでは・・と思っています。

941:デフォルトの名無しさん
09/03/28 10:41:13
子.Click += new System.EventHandler(親_Click);
子.Click += new System.EventHandler(子_Click);
てこと?


942:デフォルトの名無しさん
09/03/28 21:23:54
朝生 「不可解な逮捕 東京地検 どうなる?小沢民主党」 (2009年03月28日)
Part1 -75分-
URLリンク(www.megavideo.com)
Part2 -75分-
URLリンク(www.megavideo.com)

943:デフォルトの名無しさん
09/03/28 21:35:40
>>940
WPFをつかう

944:デフォルトの名無しさん
09/03/29 13:08:28
質問です。
これまで以下のように VB6 の ADODB.Recordset Seek メソッドで .mdb 検索を行っていました。

rs.Seek Array(1006, 10), adSeekFirstEQ


C# で再現する場合、
Seek メソッドの第1引数「Array メソッド」に相当するオブジェクトは何なのか教えてください。

945:デフォルトの名無しさん
09/03/29 13:27:57
>>944
データベースへのアクセスモデルからしてまるで変わっちゃってて、
ADOのことはよくわからないからズバリそのものな答えはちょっとわかんない。

Array 相当のものだったら、 new int[] とか new[] { 1006, 10 } とかで作れる。

キーに一致する最初の値をとりたいんだったら、LINQ to SQL 使って
var keys = new[] { 1006, 10 };
var firstEq = table.First(x => keys.Contains(x));
とかでいけると思う。


946:944
09/03/29 13:53:30
>>945
ありがとうございます。
やってみましたが仰るとおり

List<object> values = new List<object>();
values.Add(1006);

object[] array = values.ToArray();
rs.Seek(array, SeekEnum.adSeekFirstEQ);


上記のように配列をそのまま渡すことで通りました、ただし値が単一の場合のみ。
下記のようにキー値を複数設定すると「パラメータが間違っています」っておこられる

values.Add(1006);
values.Add(10);


どうしたらいいんだろな_| ̄|○

947:デフォルトの名無しさん
09/03/29 13:56:29
new object[] { 1006, 10 }

じゃダメなんけ?

948:944
09/03/29 14:07:52
>>947
スマソ。
テーブル名、インデックス名のパラメータを間違えてただけだった。

キー値が複数の場合でもバッチリいけたわ。
ありがとう、無事解決です。

949:デフォルトの名無しさん
09/03/30 05:47:23
ところで、
++
++
で、#ちゅう事なん(´・ω・) スカ?

950:デフォルトの名無しさん
09/03/30 06:25:37
>>949
アンダース・ヘルスバーグはそう言ってる。

951:デフォルトの名無しさん
09/03/30 09:19:47
そんなこじゃれた名前つけるから検索しにくくなるのだ

952:デフォルトの名無しさん
09/03/30 14:23:11
.NETよりはまし。.NETの検索し難さといったら…

953:デフォルトの名無しさん
09/03/30 14:24:12
でもCとかDよりいいよね

954:デフォルトの名無しさん
09/03/30 14:29:13
Bも忘れないであげて

955:デフォルトの名無しさん
09/03/30 17:53:03
VisualC#2008をインストールして、動作確認の為にWindowsFormsApplication1を
作成したのですが、デバッグ実行すると(0xc0000005)で終了してしまいます。
デバッグなしで実行だと、普通にウインドウが表示されます。

どうやら、プロジェクト名の長さが11文字以上だとこういう現象になるようです。
プロジェクト名が10文字以内というのは、ちょっと不便なのでなんとかしたいの
ですが、対策をご存知の方がいましたら教えてください。

956:デフォルトの名無しさん
09/03/30 17:53:44
今の今まで
C,C++,C#相談室
だと思ってた

957:デフォルトの名無しさん
09/03/30 18:17:06
昔はスレタイに # の文字入れると#が消えちゃってたから
しつこく入れるようになったんだっけかw

958:デフォルトの名無しさん
09/03/30 19:11:59
検索用じゃね?

…と思ったら、1つ目と3つ目がどちらも ASCII のナンバ記号だった。

959:デフォルトの名無しさん
09/03/30 20:04:35
いつもは3つ目が全角のナンバー記号だよ。
次スレ立てる人は気をつけて。

960:デフォルトの名無しさん
09/03/30 22:46:02
この Part51 でそろそろ終わりにしようぜ

961:デフォルトの名無しさん
09/03/30 22:52:12
2ヶ月で1スレ消費するようなペースって事は需要はあるのだろう。
Part51にもなって「そろそろ終わりに・・」ってのは今更すぎないかw

962:デフォルトの名無しさん
09/03/30 22:53:50
>>960
来なけりゃいいんじゃね?

963:デフォルトの名無しさん
09/03/31 00:36:10
スレタイに#を3パターンで書くのをこのスレで終わりしないかといってると上の流れを見ると思うのだが
俺がイカれてるのかな。そう解釈する俺が狂ってるだよなやっぱりそうとしか思えないうん

964:デフォルトの名無しさん
09/03/31 00:51:31
他のC#スレも数パターン使ってるとこあるし、検索用に残しといていいんじゃね?

965:デフォルトの名無しさん
09/03/31 01:44:20
ところでおまいらC#で組んだもの、何に利用してるの? 仕事?


966:デフォルトの名無しさん
09/03/31 01:51:26
研究
まあ仕事だけど

967:デフォルトの名無しさん
09/03/31 01:52:50
俺は趣味でちまちま作ってる。
自分専用の痒い所に手が届くような小規模アプリが殆ど

968:デフォルトの名無しさん
09/03/31 02:27:50
C#で孫の手つくれんの?

969:デフォルトの名無しさん
09/03/31 02:30:22
つまんないよ

970:デフォルトの名無しさん
09/03/31 02:49:21
つまらないものを面白くするのがプログラミングだろjk

971:デフォルトの名無しさん
09/03/31 03:14:15
窓の手ってそういう意味だったのか!素で気付かなかった

972:デフォルトの名無しさん
09/03/31 07:47:06
C井でいいんじゃね?

973:デフォルトの名無しさん
09/03/31 08:29:31
思いっきり仕事だな。
来月あたりに客先とおしてそのユーザーに公開される(´・ω・`)

974:デフォルトの名無しさん
09/03/31 08:57:55
趣味コードは全部C#。
仕事だと、社内ツールの類はC#で書いてる。


975:デフォルトの名無しさん
09/03/31 10:08:11
質問です。
PropertyGridで入れ子になっていて展開可能な項目を自動で展開したいです。
まずExpandAllGridItemsメソッドを調べてみましたが、これはカテゴリの展開専用で意味がありませんでした。
次に、GridItem.Expandedプロパティを見つけ、おおこれこそ捜し求めていたものと歓喜したのですが・・・
PropertyGridからGridItemの一覧を得る方法が分かりません。
SelectedGridItemがあって、なぜGridItemsが無いのでしょうか。

976:デフォルトの名無しさん
09/03/31 10:30:55
SelectedGridItemからParentたどってけば

977:デフォルトの名無しさん
09/03/31 11:12:02
Public Type Struct1
  Member1 As String
  Member2 As Byte
  Member3 As Byte
  Member4(20) As String
  Member5(20, 1340) As Byte
End Type

Declare Function ExpFunc1 Lib "Library1.dll" _
  (ByRef a_Struct1 As Struct1, _
  ByVal a_iNumber1 As Long, _
  ByVal a_iNumber2 As Long) As Long

ソースのない「Library1.dll」とそれを利用するための
上のようなVB6のサンプルがあるんですが、
これをC#(2008/.NET3.5)で利用するにはどう書いたら
いいんでしょうか?

よろしくお願いします。

978:デフォルトの名無しさん
09/03/31 12:49:26
>>972
++
ナ+
になっちまう

979:デフォルトの名無しさん
09/03/31 13:02:09
>>977
C#で参照してみれば?
ラッパクラ出来てインテリセンスきくんじゃないかな?

980:デフォルトの名無しさん
09/03/31 13:19:21
>>979
---------------------------
Microsoft Visual C# 2008 Express Edition
---------------------------
'Library1.dll' への参照を追加できませんでした。
ファイルがアクセス可能で、有効なアセンブリまたは
COM コンポーネントであることを確認してください。
---------------------------
OK
---------------------------

COMじゃないとNGっぽいですね。

981:デフォルトの名無しさん
09/03/31 13:22:24
DllImportでぐぐればいいんじゃね

982:デフォルトの名無しさん
09/03/31 13:23:49
>>980
ごめん、VB6のDLLかと思ってた
VB6はDLLはCOMになるから

そういうことならReflection使ってみては?
色々他にもあると思うけど

983:デフォルトの名無しさん
09/03/31 13:25:08
動的に呼び出しさせて何をさせようというんだ俺は・・・
疲れてんだな

984:デフォルトの名無しさん
09/03/31 17:19:48
>>977
2次元配列のマーシャリングってできたっけ?>識者

985:デフォルトの名無しさん
09/03/31 17:35:29
2次元配列はやったことないけど出来るはずだと思う

986:デフォルトの名無しさん
09/03/31 17:43:20
うお、今調べたら出来ないようだった、もうしわけない。
対策はいろいろあるそうだが、ストレートには出来ないそうだ。

987:デフォルトの名無しさん
09/03/31 18:18:17
とりあえずVB6の知識をひけらかすか

Public Type Struct1 
  Member1 As String 'BSTR
  Member2 As Byte '1バイト
  Member3 As Byte '1バイト
  Member4(20) As String 'UTF16な文字が20文字
  Member5(20, 1340) As Byte 'Option Base 0なら21×1341バイト
End Type

何の役にたつかはしらん

988:デフォルトの名無しさん
09/03/31 18:44:38
>>987
>UTF16な文字が20文字 はこれじゃね?
Member4 As String * 20 

Member4(20) As String はStringの配列21 (Option base によるけど)

989:デフォルトの名無しさん
09/03/31 18:52:13
立てれなかったから誰か任せた

C#, C♯, C#相談室 Part52
------------
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part51
スレリンク(tech板)

Visual C# 2008 Express Edition 日本語版
URLリンク(www.microsoft.com)

その他テンプレ>>2-5くらい

990:デフォルトの名無しさん
09/03/31 18:53:17
「ふらっと」と「VS2008」スレが新スレになってるので更新。
>>3>>5はそのままでおkかな?
-----
関連スレ

ふらっとC#,C♯,C#(初心者用) Part39
スレリンク(tech板)

Visual Studio 2008 Part 15
スレリンク(tech板)

WPF(XAML,XBAP,.NET3.5)GUIプログラミング Part3
スレリンク(tech板)

【VB.NET】LINQ友の会【C#, C♯, C#】
スレリンク(tech板)

C#,C#の宿題片付けます。
スレリンク(tech板)

991:デフォルトの名無しさん
09/03/31 18:53:59
>>987,988
参考になります。
Option Base は無指定ですので、0ですかね。

UnmanagedType.BStr をヒントにもう少しトライしてみたいと思います。

992:デフォルトの名無しさん
09/03/31 19:15:52
VB、C#混合になってしまうが
VB6で>>877の標準モジュールを含むプロジェクトを作って
VB.NETのアップグレードウイザードにかける。

やってみたがTODOが残るな・・・これもで手を入れないといけないようだ。


993:デフォルトの名無しさん
09/03/31 19:18:16
VB6もC#も中途半端な知識しか持っていないけどこんな感じではないのか、と質問していい?
unsafe struct Struct1
{
[MarshalAs(UnmanagedType.LPStr)]
string Member1;
byte Member2;
byte Member3;
[MarshalAs(SizeConst = 21)]
string Member4[];
fixed byte Member5[21 * 1340];
};

[DllImport("Library1.dll")]
static extern int ExpFunc1(ref Struct1 a_Struct1, int a_iNumber1, int a_iNumber2);

unsafeが嫌なら
[MarshalAs(UnmanagedType.U1, SizeConst = 21 * 1341)]
byte Member5[,];
としてMember5 = new byte[21, 1341];

994:デフォルトの名無しさん
09/03/31 22:01:27
>>988
そうだった
すっかり知識が抜け落ちてて愕然

995:977
09/04/01 09:48:39
UnmanagedType.LPStrとか
UnmanagedType.BStrとか
UnmanagedType.ByValArrayとか
いろいろ試しましたが、どうにもうまく行かないので、
もう諦めてVB6でラップDLL作ってそれをC#で参照して
使うことにしました。
VB6のデバッガでもう少し粘るといいのかもしれませんが
これで妥協しました。

いろいろありがとうございました。

996:デフォルトの名無しさん
09/04/01 09:55:35
MSDN見たか?まあ解決したならいいか

997:デフォルトの名無しさん
09/04/01 10:17:26
C#, C♯, C#相談室 Part52
スレリンク(tech板)

998:デフォルトの名無しさん
09/04/01 10:58:25
>>996
MSDNは 見まくり ですね。。

解決というか 逃げ ですけど、とりあえず
やれることはやれるようになったので。

VB6側の状況がよくわからずに
やみくもにやってもダメですね。
暇ができたら、ダミーの Library1.dll を作って
VB6から呼んでみて、中がどうなってるのか
確認してから再挑戦してみたいと思います。

999:デフォルトの名無しさん
09/04/01 12:33:10
MSDNよりPInvoke

1000:デフォルトの名無しさん
09/04/01 13:14:28
1000いただきまーす♪

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch