- 1 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 10:15:52 ]
- (#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
前スレ C#, C♯, C#相談室 Part51 pc12.2ch.net/test/read.cgi/tech/1233757615/ Visual C# 2008 Express Edition 日本語版 www.microsoft.com/japan/msdn/vstudio/express/vcsharp/ その他テンプレ>>2-5くらい
- 111 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:08:41 ]
- >>96
なんか分かってるのか分かってないのかよく分からんコードだな、というのが率直な感想。 なぜそうしているのか理由や必然性がわからない部分が多すぎる。 ちょっとVB上がりのコピペプログラマの臭いがする。 つーか、せいぜい70hzでしか更新されない画面をusオーダーで更新して(そもそも不可能だけど) なんか意味あるのかなw
- 112 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:04:43 ]
- >>110
テキストの更新をするだけならInvaridateで十分なのですが、ボタン操作やメニュー、ショートカットキー等々の UIの操作を行った際に発生するイベントを処理するためにDoEventsを差し込んでいます。 そういう意味で、ボタン操作やテキストの更新と書きました。 >>111 VBの方はほとんど触ったこと無いですw 実際に使用する際には画面更新中に発生したTickの回数分だけ処理をとばすようにはするのですが、 その前にタイマーがちゃんと動作するかどうかを確認している際に発生したのがこの現象です。 サンプルの方はDock.Fillなはずのコントロールがリサイズできてしまうということを確認してもらうために 余計にコントロールを追加していたり、タイマーが回っているのを視覚的に確認するために画面更新していたり しますが、実際にはウインドウにHScrollBarを貼り付けても発生しますし、TickのDrawを中身空っぽのforを 10万回回した後にDoEventsするだけでも発生します。
- 113 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:13:01 ]
- どんなに Interval の数値大きくしてもCPU使用率が上に張り付くんだけど
本当にこれで処理大丈夫なの?
- 114 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:29:36 ]
- >>112
あほな自家製タイマーがメッセージループを占有しなければ、 >UIの操作を行った際に発生するイベント はdoeventsなんか呼ばなくてもちゃんと処理されるのだけどね。 メッセージループ経由でのUIの更新は動画のような短時間での更新向きではない。 なんかWin3.1のころのメッセージループのアイドルにバックグランド処理をやらせる のを念頭に置いたりしてないか。
- 115 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:46:55 ]
- マイクロ秒とかそもそもリアルタイムOSじゃないWindowsには過酷すぎる要求ではないか
- 116 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:13:24 ]
- >>112
ちょwww スレッド分けてる意味のないコードになってるってことじゃないのか…・
- 117 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:16:13 ]
- >>112
valid Invalid Invalidate な 2回以上同じところを間違えると馬鹿みたいだぞ
- 118 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:50:34 ]
- 根本的にわかってないようだな
- 119 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:49:46 ]
- vb触った事無いらしいが
作りこみがVBにしかみえない
- 120 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:17:54 ]
- VBっぽい作り込みとC#っぽい作り込みって具体的に
どの辺が違うんですか?素で気になります。 初心者の書き方っぽいだけでVBが悪いわけじゃないのか VBを使うと必然的にそうなるのかよく分からない。 もしかして.netのVBを指している訳じゃない?
- 121 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:26:42 ]
- VB6っぽいというべきだろうな。
.NETでDoEventsを使っているなら9割がた間違った使用法と考えるべき。 何のためのスレッドかぜんぜん理解していないようだし、 Control.BeginInvokeが何をしているかも理解してないな。
- 122 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:33:25 ]
- 誰かFormとマルチスレッドとConrol.BeginInvokeについて説明してやれよ
- 123 名前:96 mailto:sage [2009/04/09(木) 20:24:27 ]
- >>121
・Application.DoEventsは、処理中に発生したイベントをすべて処理する ・スレッドは重い処理などをバックグラウンドで処理させたり、処理を並列して行うことにより高速化を図る ・Control.Invokeは別スレッドからのUIの操作をUIを持つスレッドに行わせ、BeginInvokeは処理の完了を 待たずに制御を戻し、処理の状況を確認するためのIAsyncResultを返す と理解しているのですが、違うのでしょうか? もし違うのであれば、参考となるページでもいいので教えていただきたいのですが…
- 124 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:26:59 ]
- そこまでわかってれば、DoEventsを使う必要には迫られないはずだが
- 125 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:46:32 ]
- >>123
VB6はバックグラウンド処理用にスレッドを自由に起動できなかった。 全部の処理はUIスレッドで実行するしかなかった。 だからビジーループ的な処理があると、それを実行している間はUIが 必然的に応答できなくなる。(だってその処理は、プロセス中の唯一のスレッドである UIスレッドで実行しているのだから。) その問題をやり過ごす(根本的解決ではない)ためにDoEventsは使われた。 ビジーループの中でDoEventsを実行してやると、その時点でキューにたまっていた ウィンドウメッセージが全て処理される。つまりユーザー目線では、UIが操作に反応する。 自由にスレッドを起動できるドトネトではわざわざUIスレッドでビジーループを 書く必要がないから、わざわざApplication.DoEventsを使用する理由は普通ないはず。
- 126 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:05:44 ]
- >>123
バックグラウンドのスレは高速化じゃなく、ユーザへのレスをよくするのが目的では?
- 127 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:59:33 ]
- マルチコア(CPU)なら、マルチスレッドは高速化に寄与するよ。
- 128 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:48:03 ]
- もちろん、複数スレッドで同時に仕事をやらせればの話だけどね。
- 129 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:54:50 ]
- そもそも、高速化 = レスポンスとスループットの向上 と考えれば間違ってないでしょ
- 130 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:58:00 ]
- レスポンスとスループットはトレードオフになることが多いよ。
- 131 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:26:08 ]
- やりかたによるけど反応返ってこなくなるもんな。
- 132 名前:96 mailto:sage [2009/04/10(金) 02:37:10 ]
- >>125
では、今回のように別スレッドからBeginInvokeなどが連続して呼ばれて結果的にビジーループ のようになってしまうような処理の場合、どのようにしてイベントを処理すればいいのでしょうか? タイマーの精度をあきらめる(そもそも無茶らしいですが)として、 while (!abort) { while (doEvent && !abort) { Thread.Sleep(1); } ... Thread.Sleep(1); } としてもTickの内容が重たいとビジーループになってしまうのですが… ここまでするくらいならSystem.Windows.Forms.Timerかなんかを使ってTickで処理時間分Intervalから引いていった方が いいような気もしますがw
- 133 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:41:48 ]
- UIに限って言えば
UIが属していないスレッドがいくらビジーループになっても構わないのでは? あと草が邪魔
- 134 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 09:00:49 ]
- よくわからんけど、多重呼び出しにならないよう待たせるか、
呼び出す度に重い処理のスレッド作るとか
- 135 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 09:23:03 ]
- どうせDOEVENTやってんだから普通にInvokeでやってみれば?
そんな重そうな処理でもなさそうだし Invokeの中身を高速化するために、画像を先に作っといてInvokeで呼び出されている関数内で転送するだけにするとか 以上ド素人の意見でした。
- 136 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 10:29:34 ]
- そもそも96はどんなソフトを作ろうとしてんだ?
- 137 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 10:48:24 ]
- CodeDomProvider.CompileAssemblyFromSource()
でソースを動的にコンパイルした場合、そのソースの中から アプリ本体のクラスを使うことはできるのでしょうか?
- 138 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 10:55:39 ]
- >>137
普通に出来るでしょ 参照アセンブリに追加すれば コンパイルする前に参照するアセンブリをロードしなきゃいけないんだったかな 適当にそのアセンブリのクラスを使えばロードされる
- 139 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 10:59:48 ]
- >>137
CompilerParametersに参照をしたら出来るんじゃなかったっけ? よく憶えてないけど
- 140 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 11:13:08 ]
- >>132
わざわざdoevents使うなんて 実質シングルスレッドで動かしてますよと公言するよーなもん
- 141 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 19:58:48 ]
- >>132
言ってることがよく分からないんだけど、 例えば仮に1msの処理時間が必要な処理があるとして、 この処理を同一のスレッドで1ms未満のインターバルで繰り返すことは 太陽を西から昇らせる以上に不可能だ、というのはOK? 失礼だがなんかこのあたりの当たり前のことを理解してない気もするんだが。
- 142 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 20:30:55 ]
- >>141
まずその処理が1msで終了するのか勘定してみるといい。 スレッド起動から勘定するんだぞ。
- 143 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 20:57:31 ]
- >>142?
- 144 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 21:09:47 ]
- >>142??
- 145 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 21:13:00 ]
- >>142???
- 146 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:32:31 ]
- UIスレッド以外からUIを操作すると壊れるってのも理解してないような気がする
- 147 名前:137 mailto:sage [2009/04/11(土) 01:44:04 ]
- >>138 >>139
CompilerParameters.ReferencedAssemblies.Add("EXEファイル名"); でできました。ありがとうございます。
- 148 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 04:43:38 ]
- ComboBoxコントロールなんですけど
ドロップダウンの表示幅を表示するテキストに合わせて伸縮させることは難しいでしょうか
- 149 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 08:12:32 ]
- オーナドローでググれば一撃
- 150 名前:96 mailto:sage [2009/04/11(土) 12:52:55 ]
- >>133
>>132で言ってるのは、別スレッドからTick終了後に間隔を開けずにまたTickが呼ばれるため、結果的に UIを持つスレッドがビジーになってしまう、ということです。 >>141 そこについては理解しています。 上の方にも書きましたが、BeginInvokeが何度も呼ばれないようにフラグを立てています。 ですが、 Tick Tick ├───┤ ├───┤ ├─────┤├─────┤├─────┤... インターバル ↑ インターバル ↑ インターバル ↑:Tick呼び出し となればTickとTickの間にほかのイベントを処理することが可能なのですが、今回の場合 Tick Tick ├─────────┤├─────────┤ ├─────┤├─────┤├──┤├─────┤├──┤... インターバル ↑ インターバル 待機 ↑ インターバル 待機 となってしまい、結果的にUIスレッドがビジーになってしまうため、ということを言いたかったのです。 わかりにくくてすいません。 >>146 BeginInvokeやInvokeでUIを持つスレッドに処理を任せても壊れてしまうのでしょうか? 別スレッドからUIを直接操作すると壊れる、ということは実験したことがあるのですが…
- 151 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 12:55:05 ]
- >>150
結果的にUIスレッドがビジーになってしまうため、 → × 結果的にUIスレッドがビジーになってしまう → ○ です。
- 152 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 13:44:31 ]
- あんたはどんなアプリを作ろうとしてんだ
- 153 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 15:00:31 ]
- >>96=150=151
まず、設計が滅茶苦茶。原因は知識不足にあるのは明白なので、 勉強しろ(ここで問答しても埒が明かない)としか言えない とりあえず、コードの不備だけ指摘すると、 UIスレッドでdoEvent=trueにしてるから、BeginInvokeが複数回呼ばれる可能性がある タイミングによって、上記が全て完了する前にdoEvent=falseになっていることがある その場合、更にBeginInvokeが複数回呼ばれる で、暫くすると...\(^o^)/
- 154 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 15:34:36 ]
- >>149
遅くなりましたけど、ありがとうございました。 オーナードローでいろいろ調べてやってみます。
- 155 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 15:44:18 ]
- doEventフラグがlockまたはvolatileで宣言されてない。
それにdoEventはBeginInvokeする前に設定しなきゃいかんだろ。 もっと言えばInvoke使えばフラグはいらない。
- 156 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 15:52:22 ]
- もひとつ、BeginInvokeでBitmapに描画、PictureBoxに設定、DoEventsの呼び出しを
やってるわけだが、Bitmapの描画はスレッド側、 つまりBeginInvoke呼び出し前に処理していいだろう。 何のためのスレッドだよ。BeginInvokeの中身は軽くしなきゃ。
- 157 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 16:00:08 ]
- >>153
> UIスレッドでdoEvent=trueにしてるから、BeginInvokeが複数回呼ばれる可能性がある その点については、本人は治したと言ってるが、本当に治っているかどうか怪しいな
- 158 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 16:15:55 ]
- アニメーションを表示するのにpictureboxを使うものなのか?
直接スクリーンに描くにせよ、イメージにいったん描いて画面に転送するにせよ、 普通はPanelか何かにGraphices#drawImageを使うぞ。 そうすればControl.Invoke自体いらなくなる。
- 159 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 16:20:26 ]
- 普通はOnPaint、Invalidate、Updateを使うだろうな
ただし、バックグラウンドで生成した画像を表示する必要があるなら PictureBoxを使ってもやってることは変わらないかも
- 160 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 16:25:47 ]
- >>159
動画のようなアニメーションにOnPaint、Invalidate、Updateはつかわんだろう。 はなはだ効率が悪いのに。
- 161 名前:96 mailto:sage [2009/04/11(土) 16:41:50 ]
- >>152
C#の勉強もかねて自分用の動画編集ソフトを作成しています。 >>153,155 その点については、>>100で指摘を受けてTick呼び出し前にdoEventをtrueにするように修正しましたが、 現在Invokeに置き換えて様子を見ています。 >>156 最終的な目標としては、もう一つスレッドを立ててそこでイメージを生成するようにしたいと考えています。 しかし、まだタイムラインのUIに手をつけたばかりなので、とりあえずTick内でイメージを生成するようにしていました。 >>157 上記の通り、Tickの前にdoEventをtrueにするようにし、BeginInvokeが重複して呼ばれることがないことを 確認しましたが、volatileをつけていなかったため、偶然だったのかもしれません。 >>158,159 PictureBoxよりもPanelに描画する方がいいのでしょうか? OnPaintやControl.CreateGraphicsで直接描画するのとPictureBox.Imageにイメージをセットするのは ほとんど変わらないものだと思っていたのですが…
- 162 名前:96 mailto:sage [2009/04/11(土) 16:48:26 ]
- これだとさっきと言いたいことが変わってる orz
>>156の部分の追記 ただ、ファイルアクセスがネックになってイメージの生成が遅れた場合に>>150の図のようになってしまうので、 これについてもどうにかしたいのですが…
- 163 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 16:50:27 ]
- アプリ見て大体想像していたが、動画編集アプリかよw
だったら、100マイクロ単位のタイマーなんてぜんぜん必要ねーじゃねーかよ。 なぁ、どっからマイクロ秒なんてものが必要と思ったんだ?
- 164 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 16:55:16 ]
- DirectShow使えばいいじゃん・・・
- 165 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:11:58 ]
- もうそこまでやるならDirectX使うべきだな
- 166 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:15:52 ]
- WinFormsでリアルタイムで動画イメージ生成して描画とかさすがにありえんわ
- 167 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:16:04 ]
- 勉強にケチつけないでいただきたい
- 168 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:23:40 ]
- >>167
偽物乙w >>165 DirectXにあまり期待してはならない。 しかも自分しか使わないソフトならいざ知らず、 ビデオカードによってはアレだ
- 169 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:37:22 ]
- 偽者とは違う
偽装するなら名前欄に番号でも入れるよ
- 170 名前:96 mailto:sage [2009/04/11(土) 23:38:53 ]
- >>163
30fpsで1フレーム辺り33.333...msで、再生していると徐々にずれてくるかなと思ったのですが、 どうにか100μs単位まで行かなくてもいけそうになりました。 ただ、どちらにしてもやり方的には変わらないので、根本的には解決できてないです。 >>164 DirectShowは、DirectShow.NETを触ったりしましたがさっぱりわかりませんでした。 いろんなDirectShow関連のサイトも行ってみましたが、全く歯が立ちませんでした orz >>165 DirectXや3Dは全く触ったことがなく、調べてみるとほとんどC++みたいなのですが、 .NET上から触ることはできるのでしょうか?
- 171 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:44:32 ]
- >>170
managed directx
- 172 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:13:36 ]
- あのさ、編集ソフト内での再生ズレを考える必要ないの。(程度によるのは当然)
わかる?編集ソフト内での再生は映像と音声の同期さえあってれば適当な再生速度で十分なわけ。ミリ単位で十分なわけ。 そもそもあんたはマイクロ秒のズレなんてわかるんかよ。 ミリ秒単位でやったとしても1時間のもので40秒しかズレねーんだよ。 ファイルさえきっちり作成できればいいの。 後は、再生ソフトの役目なんだよ。
- 173 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:18:50 ]
- >>172
まあまあ。 それはそのソフト作る側の考え方によるだろ。 自分がそういうふうに作れって言われたわけじゃないんだからおちつけ。
- 174 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:22:16 ]
- これが落ち着かずにいられるかって!
- 175 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 01:11:12 ]
- >>170
そうか? サンプル分かり易いと思うし、それにCodePlexにTimeLine.NETとかSplicerとかいった編集用のライブラリとかある。
- 176 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 01:17:58 ]
- >>172
納期が決まってるとか予算が決まってるならともかく 趣味レベルなら別にかまわんのじゃ? 編集ソフト内の再生ズレ、なくせるんだったらなくした方がいいと思うし。
- 177 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 08:15:18 ]
- C#の勉強もかねて・・・・
そういえばみんな言語始めるとき勉強はなにからやってるんだろう 俺は新しい言語をやる時に 画面のコントロールの簡単な使い方 標準的なファイルの入出力 簡単な入力チェック系 データベースの 接続・追加・更新・削除 位からやってる あとはWEBかクライアントに合わせて色々やること増えるけど
- 178 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 08:33:54 ]
- またHello Worldからかよorz
- 179 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 10:15:50 ]
- 昔よくやってたのはラインアート作るとか。
今時だと、>>177 で出てるネタを押さえるようないいサンプルアプリが欲しいなぁ。
- 180 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 11:39:50 ]
- 俺の場合は、初めに電卓、次にタイマー等が用意されてるなら、
テトリスやリバーシみたいな簡単なゲームを作る事にしてる。 ある程度、実用 ( 娯楽 ) 性があるものを作成すると、理解が早い気がする。
- 181 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:35:22 ]
- たしかに作ってて多少モチベが上るようなのじゃないと
だれるもんね。 Web サービスのクライアントなんて 結構実装簡単だし、すぐ使えるからよさげじゃない? REST API 公開してるサービスめちゃめちゃ多いし。
- 182 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 13:54:16 ]
- >>170
徐々にずれるのが嫌なら再生開始時からの経過時間を使って、 間隔を調整すればいいだろ。
- 183 名前:96 mailto:sage [2009/04/12(日) 14:26:29 ]
- >>172
>そもそもあんたはマイクロ秒のズレなんてわかるんかよ。 30fps時の端数分(333μs)ずつずれていくと、100フレームほどで1フレーム遅れる計算になります。 数秒再生して1フレームも遅れるのは結構致命的だと思うのですが… >>175 C++やDirectX、COMを触ったことがないからだと思いますが、何が何だかさっぱり… ISampleGrabberからIBaseFilterへとか、継承しているわけでもないのになぜキャストできるのでしょうか? 同じメソッドを実装するだけでキャストできるのかと思い、テスとしてみたのですが当然できるはずもなく。 Splicerはおもしろそうですね。 >>182 現在はTickが呼ばれるたびに誤差を計算して次に加算するように変更したので、多分μs単位で いじらなくてもあまりずれないようにはなっていると思います。
- 184 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 17:54:19 ]
- >>161
>OnPaintやControl.CreateGraphicsで直接描画するのとPictureBox.Imageにイメージをセットするのは >ほとんど変わらないものだと思っていたのですが… Control.CreateGraphicsを使えば別のメソッドから使えるというのがメリットなのよ。 GUIはGUIスレッド以外から扱ったらいけないと思い込んでるようだけどこれは例外。 つまり、メッセージループを使ったりBeginInvokeを使ったりする必要がない。 メッセージループのことは気にせずに、 独自のスレッドで連続して処理問題ないということ。(普通はプライオリティを若干下げてやる。) OnPaintやPictureBoxなどに処理を任せるのは画面が無効になったときの再描画の処理を やってくれるからであって、短いサイクルで描画を繰り返す場合は、その必要性がない。 Control.CreateGraphicsを使えばInvalidateやUpdateを呼ばなくても指定したタイミングで描画することが出来る。
- 185 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 19:18:43 ]
- >>184
そんなトンデモ説を得意げに言っちゃだめw 最初の行の「別のメソッドから」は「別のスレッド」と言いたかったんだろうが、 そんな話見たことも聞いた事もない。 Control.CreateGraphicsを使う場合のメリットは、Invalidate⇒OnPaintという 通常の処理に比べてオーバーヘッドが少ないことなんじゃないの? 逆にデメリットは、描画処理を呼ぶトリガーをOnPaintに一本化できないことでしょ。 もっとも、>>96のように短い一定時間ごとに必ず描画するのならダーティー化 された場合のことを考えなくていいからデメリットと言えないんだろうけど。
- 186 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 19:30:05 ]
- 一応、Control.CreateGraphics はスレッドセーフだと言っておこう
- 187 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 19:36:55 ]
- >>186
すまん確かにそうだったw グラフィック関連長いこと触ってないんで忘れてたよ。
- 188 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 20:13:37 ]
- >>96に最小限の修正を加えてろだに上げてみた。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9025.txt 注、Stopのときの再描画処理としてpicturebox1にPaintイベントを追加している。
- 189 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 20:55:18 ]
- 188です。lockの位置を間違ってた。
複数のスレッドからimageを使うことになるので、 lockはvoid Draw(int rad)全体にかけたほうがよかった。 だた、startフラグで制御してるのでただし実行に影響はないはず。
- 190 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 17:01:47 ]
- WinアプリでDataGridViewの行を大量に追加・削除するときって
SuspendLayoutとかの呼び出しをやった方がいいんだろうか? 位置を移動させるとかの場合は効きそうだけど今一歩やるべきかどうかの判断がつかないんだが・・・ 今はおまじない的にやってるけども
- 191 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:34:50 ]
- データソースをViewから切り離してから追加・削除すると速いかも
- 192 名前:デフォルトの名無しさん [2009/04/14(火) 20:34:17 ]
-
これ見てみw 国会の無駄な手当てでお手盛り人件費じゃぶじゃぶの実態w この経済危機に税金をなんでこういう公務員、国会職員に税金くれてるの? ↓ 衆議院議員 渡辺周氏「呆れ返る国会のムダ呆れ返る国会のムダ」 www.choujintairiku.com/watanabes.html 内閣の閣議でどれだけお手盛り大盤振る舞い、浪費が行われているかわかるね。 これが自民党−麻生内閣の実態!!
- 193 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 20:39:03 ]
- >>192
text/plainでくれ
- 194 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 21:25:00 ]
- なんだかんだで結構親切に教えてくれるおまえらが好き。
- 195 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 21:26:06 ]
- どういたしまして
分からないことがあったらまたおいで がんばってね
- 196 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 22:06:03 ]
- ありがとう。
いつかは教えられる側にまわれるよう精進します。
- 197 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:00:27 ]
- 今、クライアント(C#)-WCF-サーバ(C#)-SQL Serverなアプリケーションを作って
いるんですが、クライアントからデータを検索する必要があります。検索条件 によっては、戻り値のデータが数万件になることもあります。 そこで、WCFのバインディングのmaxReceivedMessageSizeを大きくして対処 しようと思ったのですが、途中でキャンセルできる必要とサーバのメモリを 節約する必要が生じました。 どのように実装するのがいいでしょうか? 現在の処理) 1. クライアントが検索条件を指定してサーバを呼ぶ 2. サーバは検索条件によって、SQL Serverの複数のテーブルを検索し、複数 レコードからオブジェクトを組み立てる 3. オブジェクトの配列(やツリー構造)が出来上がったらクライアントに返す 案) 1. サーバはDataReaderでデータベースを検索しているので、一定レコード数 ごとに結果をクライアントにレコード単位でコールバックする。オブジェクト はクライアント側で組み立てる。 2. DataReaderからデータを読みつつ、一定オブジェクト数ごとに結果をクラ イアントにコールバックする。ただし、各オブジェクトの大きさはそれぞれ違 うので、オブジェクトの数ではメモリ使用量は計れない。 3. クライアントでデータ取得依頼だけして、数秒おきにサーバに結果を取りに 行く。 4. 戻り値はStreamとし、オブジェクトが出来るたびにStreamにオブジェクトに 入れ、クライアントはそのたびにオブジェクトをデシリアライズする。ただし、 DataReaderを読みつつStreamにオブジェクトを入れる方法がまだ分かってない。 よろしくお願いします。
- 198 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:06:00 ]
- 普通に API (鯖側)のほうでページングに対応すれば?
- 199 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:15:40 ]
- どっちも非同期で実装すればいいんじゃね?
- 200 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:18:27 ]
- >>198
ページングとは、 1. クライアントで検索依頼 2. クライアントから1ページ目要求 3. データがなくなるまで、2をnページ繰り返し ということでしょうか? サーバで全データをメモリに読み込むことは出来ないので、データベース上に 昇順でユニークなIDが必要になるという理解であってますか?
- 201 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:20:07 ]
- SQL で指定できるでしょ。上限件数
- 202 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:21:31 ]
- >>199
すみません。具体的に御願いできますか?非同期でクライアントから依頼して サーバから非同期でコールバックするという意味でしょうか? だとすると>>197の案1, 2ですよね
- 203 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:23:35 ]
- WCF でのサービスメソッド呼び出しを非同期にする。
サーバーでのクエリ実行を非同期にする。 で、適宜タイムアウト。件数が多すぎるとき? シラネ。
- 204 名前:201 mailto:sage [2009/04/14(火) 23:23:55 ]
- あー、説明不足かもしれんので一応。
TOP 句 ttp://msdn.microsoft.com/ja-jp/library/ms189463.aspx ROW_NUMBER 関数 ttp://msdn.microsoft.com/ja-jp/library/ms186734.aspx
- 205 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:25:22 ]
- >>201
上限件数は指定できます。ただ、最初の件数以降の次のデータを指定するのは 難しい状況です。ユニークで昇順なキーがないので。 データが多いからといって、途中で検索をやめてしまうのはだめです。 ただ、サーバがメモリ不足で落ちるのは駄目ですが、クライアントがメモリ不足 で落ちるのはまだ許容範囲です。
- 206 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:28:13 ]
- ダメです、とか、なんでえらそうなの?
- 207 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:30:37 ]
- >>204
ROW_NUMBER知りませんでした!!使えそうですね。ちょっとこれから調べてみます。 >>206 申し訳ないです。エラーで結果が出ないのはいいのですが、結果が正しくないの は一番やってはいけないことなので、あのような書き方になってしまいました。
- 208 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:31:17 ]
- >>205
TOP でも 3 回(だっけ?)組み合わせればここからここまでっての 一応できるんだよ。 まぁ天啓にあった某関数と同じ機能な ROW_NUMBER サポして くれたからこれでよくなったけど
- 209 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:58:26 ]
- カーソル付きのDBMSならHTTP鯖のセッション情報にカーソル情報書き込んでしまえばいいと思った
- 210 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 00:08:13 ]
- >>209
なるほど。
- 211 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 21:30:23 ]
- OLAPに対応してるのってMSSQL2008からだよね。
大丈夫かな?
|

|