[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 07/26 10:23 / Filesize : 199 KB / Number-of Response : 675
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

VB.NET質問スレ(Part30)



1 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 10:00:19 ]
前スレ

VB.NET質問スレ(Part29)
pc12.2ch.net/test/read.cgi/tech/1235206416/l50

テンプレは>>2

301 名前:291 mailto:sage [2009/06/30(火) 13:51:15 ]
>>300
先生ありがと!

サンプルを元にやってみたけど
他アプリから値を変えても値が変わらない。。。
値渡しになってる?
Public Structure ST_SUB
Public s1 As Short
Public s2 As Short
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Class ST_AREA
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _
Public stSub1 As ST_SUB()
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _
Public stSub2 As ST_SUB()
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _
Public stSub3 As ST_SUB()
End Structure

Public stArea As ST_AREA
Declare Function MemOpen Lib "xx.dll" (<MarshalAs(UnmanagedType.Struct)> ByRef Address As ST_AREA) As Integer

Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click
Dim iRes As Integer
iRes = MemOpen(stArea)
End Sub

302 名前:291 mailto:sage [2009/06/30(火) 13:54:35 ]
End StructureじゃなくてEnd Classだ o...rz

Openしたときは最後に書き込んだ値が取れます。
VB側から書き込んでも相手の値は変わらず。。。

303 名前:291 mailto:sage [2009/06/30(火) 16:17:43 ]
お、落ち着くんだ私。

Declare Function MemOpen Lib "xx.dll" (ByRef Address As ST_AREA) As Integer
だな。

Cで書かれてるDLLの引数の型がPVOID*だから構造体でなくクラスで合ってると思うけど
オープンした時のみ値が取得できる状況です。。。

助けてティーチャー orz

304 名前:デフォルトの名無しさん [2009/06/30(火) 16:31:44 ]
ByValArrayは構造体専用
構造体にしてByRef IntPtrで受けるか、配列の要素を全部フィールドに展開するか

305 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 02:11:46 ]
DataSetてどういう場合に使用するものなのでしょうか?
mdbファイルにadoを使いデータを抽出(SQL文を使用)
この抽出結果を一時的に保管しておく器とかに使うものなのでしょうか?

306 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 07:34:02 ]
>>303
> Cで書かれてるDLLの引数の型がPVOID*だから構造体でなくクラスで合ってると思うけど

意味がわからん。P/Invoke のサンプルからやり直せ


307 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 07:34:13 ]
>>305
そんな感じ。

308 名前:デフォルトの名無しさん [2009/07/01(水) 10:02:21 ]
>>306
ポインタへのポインタが必要だから参照型(構造体ではなくクラス)の参照渡しにすればいいんだよ
理屈は間違ってない

309 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 10:39:35 ]
>>305
SQLでの問合せの結果(複数行)をとっとくのがDataTable、
DataSet は DataTable のコレクション+αの機能。



310 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 10:41:48 ]
>>308
すごく…おかしいです。

311 名前:デフォルトの名無しさん [2009/07/01(水) 10:57:19 ]
おかしいも何も、MSDNに書いてある

312 名前:291 mailto:sage [2009/07/01(水) 11:26:45 ]
>>308さんのおっしゃるとおり
ttp://msdn.microsoft.com/ja-jp/library/awbckfbz(VS.80).aspx
上記サイトの
アンマネージ シグネチャ  マネージ宣言 1 レベルの間接参照 class MyStruct(…);
DoWork(MyStruct** x);   DoWork(ByRef x As MyStruct)
部分をみて構造体ではなくクラスにしないといけないのかなと判断してます
解釈が間違ってますかね?

>>304さん
>構造体にしてByRef IntPtrで受けるか
この意味が私の考えで合っているのかわかりませんが、
IntPtr型でポインターのアドレスを受け取り
構造体にキャストして割り当てるということなのでしょうか?

それとは別に、クラスにしてByValArray以外の方法(参照渡しができる方法)で
配列を作って引数に渡すことができればなぁと考えています。

考え方がC言語に偏っているので変なことを言ってるかもしれませんが
先生方、どうか温かい目でアドバイスをお願いします m(_ _)m

313 名前:デフォルトの名無しさん [2009/07/01(水) 11:40:47 ]
クラスなら配列の要素と同じ数だけフィールド並べるしかないんじゃないの

314 名前:デフォルトの名無しさん [2009/07/01(水) 11:56:18 ]
構造体として定義して、その配列を参照渡し(ByRef)してみるのはどうだろう
でも配列渡すならアドレス固定しないといけないから、IntPtrで受けてMarshal.PtrToStructureの方がまだ簡単確実

315 名前:314 [2009/07/01(水) 12:03:44 ]
アドレス固定したら結局IntPtrで渡すことになるな
一行目撤回

316 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 13:12:57 ]
>>299
>VBってこういうことできないんですか?
P/Invoke で外部関数呼び出し時には引数の変換がされるが、それ以外のタイミングで
Managed なコードから Unmanaged な領域を弄る簡単な方法はない。
おとなしく Marshal の共有メソッド (Read〜/Write〜等) に IntPtr を渡す方法を試せ。

317 名前:デフォルトの名無しさん [2009/07/01(水) 13:14:58 ]
やっと理解できた
VBのメンバを通してC側に直接書き込もうとしてたのか
マーシャリングでは無理だ
VBでは構造体も使えない
IntPtrで受けてMarshal.WriteByteでも使って直接書き込むしかない

318 名前:291 mailto:sage [2009/07/01(水) 15:41:43 ]
先生方いろいろとありがとうございました。
以下のように落ち着きました(ST_SUBは以前のまま)
Public Structure ST_AREA
Puclic BaseAddr As IntPtr
Default Public Property stSub1(ByVal index As Integer) As ST_SUB
Get
Dim Offset As Integer = index * Marshal.SizeOf(GetType(ST_SUB))
Return CType(Marshal.PtrToStructure(BaseAddr, GetType(ST_SUB)), ST_SUB)
End Get
Set(ByVal value As ST_SUB) ' indexのサイズ超えは省略
Dim Offset As Integer = index * Marshal.SizeOf(GetType(RDS_DATA_AREA))
Marshal.WriteInt16(BaseAddr, Offset, CType(value.s1, Short)) ' ここをまとめたい
Marshal.WriteInt16(BaseAddr, Offset + Marshal.SizeOf(value.s1), CType(value.s2, Short)) ' まとめたいよ
End Set
End Property 'stSub2 と stSub3 も同様 オフセットを間違えないように!!
End Structure
Public stArea As ST_AREA
Declare Function MemOpen Lib "xx.dll" (ByRef Address As IntPtr) As Integer
Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click
Dim iRes As Integer = MemOpen(stArea.BaseAddr)
stArea.s1 = 10 'テストですよ
End Sub
SetのWriteInt16を一行にまとめたいとこですが思いつかなかったのでこんなです。
相手側アプリとの確認も取れました。VBむずかしいです orz
ありがとうございました〜

319 名前:291 mailto:sage [2009/07/01(水) 16:00:09 ]
XXX = stArea.s1
はできたけど
stArea.s1 = 10
はできてなかったorz
まぁでも何とかなりそうです^o^



320 名前:デフォルトの名無しさん [2009/07/03(金) 20:13:21 ]
XmlDocumentのSaveメソッドで「'」を「'」として書き出す方法ってないのかな?


321 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 20:51:09 ]
ウィンドウと内部処理(DLL)を別のプロジェクトで作成しました。
質問は、DLLからFormに張ってあるコントロールのプロパティを変更する方法です。
Labelの文字を変える程度でいいのですが。

よろしくお願いします


322 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:19:41 ]
>>321
フォームから DLL にコントロールの参照を渡してやれば OK

323 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:15:41 ]
VS2005です

ユーザーコントロールにDataGridViewを貼り付けてColumnを2つ追加しました
これにイベントハンドラを記述するとユーザーコントロールのコンパイルは通りますが
コントロールの読み込み時にエラーが発生します

'RowsAddedイベントハンドラ
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles DataGridView1.RowsAdded
DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Descending)
End Sub

列のSortModeがNotSortableに設定されているとき
列ヘッダーのSortGlyphDirectionをDesendingに設定することはできません
というエラーが出てるようですが、プロパティではSortModeはAutomaticになってます

ほわい?

324 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:28:19 ]
なってます、ってどうやって確認したの?

325 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:34:02 ]
>>324
ありがとうございます。
DataGridviewの設定はすべてデザイナでやってますので

326 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:37:02 ]
改行したら送信してしまいました
つづきです

デザイナでやってて、Columnもデザイナであらかじめ追加してます
デザイナ上でのプロパティではAutomaticになっております

327 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:47:38 ]
とりあえず、デザイナで設定したプロパティは忘れて、

'RowsAddedイベントハンドラ
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles DataGridView1.RowsAdded
If ...SortMode <> NotSortable Then
 DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Descending)
End If
End Sub

みたいにしてみるとか、エラーが出たときにウォッチしてみるとか、
その辺で確認してみたら?

328 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:07:50 ]
了解っす

329 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 00:02:23 ]
うまく行きました!
データがない状態の時NotSortableになってんのかな?
ありがとうございました



330 名前:デフォルトの名無しさん [2009/07/04(土) 00:19:06 ]
>>320
そんなに大きくないならStringWriterで文字列に書き出して置換すれば

331 名前:デフォルトの名無しさん [2009/07/05(日) 14:28:39 ]
DataGridViewにdataset内部でリレーションシップを設定したTableA TableBのフィールドを表示したいんです

TableAとTableBは1対多結合になります
フィールドは同一のDataGridViewで表示したい
TaleBを連結したDataGridViewに非連結列を追加してTableAのフィールドを検索して貼り付けることはできそうですが
なんかデザイングリッド上でぱぱっとやれそうな気がしておたずねしました

何とぞよろしくお願いいたします

332 名前:デフォルトの名無しさん [2009/07/05(日) 15:31:23 ]
ググっても見つからないので質問させてください。
Textboxに入力されたデータから特定の行(ex:15行目から20行目)だけを取り出したいのですが、何か方法はないでしょうか?
よろしくお願いします。

333 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 15:36:17 ]
>>332
どう検索したのか興味がある

Linesから適当に取得すればいいっしょ

334 名前:デフォルトの名無しさん [2009/07/05(日) 15:50:04 ]
>>333
初心者故に文字列の取得方法が分かりません。
申し訳ないです。

335 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 16:16:51 ]
答え出てるじゃんw

336 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 16:18:49 ]
DataGridViewをほぼ同じような表な形で印刷したいのですが、自分でライン書いて表の中のデータを書くというっ事をしなければならないんでしょうか?
DataGridviewをそっくりそのままの形のレイアウトで印刷してくれるようなもっと簡単なのがあってもよさそうなのですが・・・

337 名前:デフォルトの名無しさん [2009/07/05(日) 16:22:09 ]
>>335
すいません、Linesはどのように扱えばいいのでしょうか

338 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 16:24:10 ]
表形式で出力できるレポートツールを使う、ってのが一般的かね。

おれはグリッドそのまま出せてもなんもうれしくないから、必要性を感じないな。

339 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 16:28:42 ]
>>337
msdn.microsoft.com/ja-jp/library/system.windows.forms.textboxbase.lines.aspx

↑を見て、何がわからないのかきちんと説明しろ。



340 名前:デフォルトの名無しさん [2009/07/05(日) 16:54:21 ]
>>339
ごめんなさい
これを別のTextboxに出力させる方法が分かりません。

Dim counter as Integer
'Create a string array and store the contents of the Lines property.
Dim tempArray() as String
tempArray = textBox1.Lines

'Loop through the array and send the contents of the array to debug window.
For counter = 0 to tempArray.GetUpperBound(0)
System.Diagnostics.Debug.WriteLine( tempArray(counter) )
Next

341 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 16:54:58 ]
Form右上の×ボタン押したときに終了するか確認メッセージ出して、
終了の場合は閉じるようにしたいんですが、closingイベント以外で実装
はできませんか?
今やりたい事は、フォームA→フォームBを呼び出してそこから終了
した場合、上記の確認メッセージを表示して両方のフォームが落ちるようにしたいです。
フォームBを×ボタンで閉じる動作を行うとフォームAをcloseという処理を走らせたい
のですが、フォームAにも上記のclosingイベントを実装する為
フォームB終了確認メッセージ後に、フォームAの終了確認メッセージが表示されてしまいます。
closingイベント内でフラグ立てて回避出来るかなと思ったら、無限ループに陥ってしまい無理でした。
どのような解決方法があるか教えていただけると幸いです。
よろしくお願いいたします。

342 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:19:49 ]
FormB : FormClosingでキャンセルかどうか決める
FormA : FormBのFormClosedで自分をCloseする
    FormClosingでFormBが閉じられたときに呼び出された場合確認ダイアログを出さない

343 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:20:14 ]
>>341
> Form右上の×ボタン押したときに終了するか確認メッセージ出して、
> 終了の場合は閉じるようにしたいんですが、closingイベント以外で実装
> はできませんか?

できない。

> 今やりたい事は、フォームA→フォームBを呼び出してそこから終了
> した場合、上記の確認メッセージを表示して両方のフォームが落ちるようにしたいです。
> フォームBを×ボタンで閉じる動作を行うとフォームAをcloseという処理を走らせたい

Closing イベントで閉じられる理由を確認すればいいんじゃね?

344 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:21:03 ]
>>340
ってことは、取得する方法はわかったわけだ。

設定したいなら、「別のTextBox.Text = 取得した値」でOK。

345 名前:デフォルトの名無しさん [2009/07/05(日) 17:27:40 ]
>>331ですけど
ソースコードでテーブルをもう一つ作ってマージするって方法は見つけました

それが正解でしょうか?

コーディングなしで2つのDataGridViewで親子テーブルを作る例はいっぱいありましたが
それを単一のDataGridViewで表示するのって逆に難しいんですね

346 名前:デフォルトの名無しさん [2009/07/05(日) 17:37:31 ]
>>344
Dim counter As Integer
Dim tempArray() As String
  tempArray = textBox1.Lines

For counter = 0 To tempArray.GetUpperBound(0)
TextBox2.Text = tempArray(counter)
Next

こういうことでしょうか?
行数はFor counter = 0 To tempArray.GetUpperBound(0)の数値をいじればいいのですよね?

347 名前:341 mailto:sage [2009/07/05(日) 17:58:28 ]
FormBの処理
FormB Closingイベントで確認ダイアログ表示
NOを返す→e.cancel=true (これでキャンセル)
YESを返す→FlgをtrueにしてFormA.close

FormA
上記のFormA.closeによって、FormAのClosingイベントが呼び出される。
FlgがTrueの場合、Closingイベント内の確認ダイアログはスルー。

私としては、上記の内容でいけると思ってたんですが、
FormA.Closeを実施のところで、何度も確認ダイアログが表示され
無限ループに陥っているようでした。

また、FormBのclosingイベント内に確認ダイアログをもうけないで
FormA.closeのみおいてみると何故か無限ループでエラーが出てしまいます。
その際、FormAにはClosingイベントはおいてません。
どなたか理由がわかる方いませんか?

348 名前:336 mailto:sage [2009/07/05(日) 18:18:31 ]
>>338
>表形式で出力できるレポートツール
とは、どういうものなのでしょうか?

クリスタルレポートとかそういうものですか?
私は今、Vb2008を使ってるんですが、コントロールの一覧の中にCrystalreportがないのですが、なにか設定がいるんですかね

349 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:44:20 ]
>>346
取得する行が決まってるなら、ループで回す必要はない

>>347
わかりづらいから、きちっとコード出してみ?

>>348
おまえさんの言うとおり、クリスタルレポートとか。
Edition によっては含まれてないんじゃない?



350 名前:デフォルトの名無しさん [2009/07/05(日) 19:45:30 ]
>>349
できました
ありがとうございます。

351 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 20:33:55 ]
初期画面をログイン画面にしたいのですが、ログイン成功時にログイン画面をクローズして別フォームを表示したらフォームが全て落ちます。助けて下さい。

352 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 20:48:35 ]
別フォームを表示してからログイン画面をクローズする
sub mainからログイン画面を表示する

353 名前:336 mailto:sage [2009/07/05(日) 23:12:53 ]
>>349
Express Editionなんですが、クリスタルレポートは追加できないんでしょうか?

354 名前:351 [2009/07/05(日) 23:20:33 ]
>>352
メイン画面をログイン画面に設定したらログイン画面落とした時点で
ほかのフォームも全て落ちちゃうんですよね。

355 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:22:20 ]
>>353
www.microsoft.com/japan/msdn/vstudio/products/compare/default.aspx

ダメだね。

356 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:36:56 ]
>>354
ログインをメインにするから不味い、ってことだろ。

357 名前:デフォルトの名無しさん [2009/07/06(月) 01:28:08 ]
>>331ですが、データソースを見るとリレーションが効いて
親テーブルの下に子テーブルが見えてるんですが

こいつをDataGridViewの単一テーブル上に展開できません

tableA
fieldID
fieldA
tableB
fieldID
fieldB

fieldID fieldA fieldB のような表現をしたいのですが・・・やはり無理でしょうか?

358 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 02:13:56 ]
表示用に列一つ追加してExpression使うのが一番楽かな

359 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 02:24:49 ]
あ、DataColumn.Expressionな



360 名前:デフォルトの名無しさん [2009/07/06(月) 10:10:53 ]
>>358
やっぱりそうですか
誰かに言って貰わないと楽ちんな方法を知らずに回り道してるんじゃないかと心配で
先に進めないもので・・・

ありがとうございました

361 名前:デフォルトの名無しさん [2009/07/06(月) 11:56:20 ]
>>331
たびたびすみません。

datasetのデザイナで子テーブルにフィールドを追加しフィールドプロパティのExpressionに
TableA.FieldAを設定すると
リレーションシップ0が見あたりません
そこで
parent(リレーションシップ名).FiedlAを設定すると
リレーションシップ名が見あたりません

となります。datasetデザイナ上では確かにリレーションシップを設定してその名前をコピペしてるので間違いないと思うのですが

もしかしてコード上で設定しないといけないのでしょうか?

362 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 12:14:49 ]
Expression設定してるところでブレークポイント設定して確認すれ

363 名前:デフォルトの名無しさん [2009/07/06(月) 13:05:59 ]
>>362
datasetデザイナ上でプロパティを設定してるだけなので・・・・

よっぽどまぬけなことをやってるのかググっても該当するものは出てこず・・・

orz

364 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 13:19:17 ]
現在のプロジェクトをExpressionで検索してみろよ

365 名前:デフォルトの名無しさん [2009/07/06(月) 13:25:32 ]
>>364
やっと意味がわかりました。なるほど・・・

で、やっと設定できました

原因は不明ですが、ビルドしたら親テーブルのフィールドを認識するようになりました

お騒がせしました

366 名前:デフォルトの名無しさん [2009/07/06(月) 19:24:59 ]
すみません
VBからTwitterに文字列を投稿する方法はAPI以外にないでしょうか?

367 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:54:39 ]
これがWin32APIの事を指していたら、それはそれで面白いかもしれんね。

368 名前:デフォルトの名無しさん [2009/07/06(月) 21:55:30 ]
>>367
TwitterAPIの方です

369 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:15:26 ]
SerialPortにて0.1Sec毎に送受の通信を行っているプログラムなんですが
フォームに配置しているボタンを連打したり、データグリッドを更新させたりしてプログラムに一次的に負荷をかけると、その間だけ送受の通信が止まってしまいます。
ためしにForm2を作ってその別のフォームで単独で通信させていてもForm1にあるボタン等を連打して負荷をかけると同じような結果でした。

こういう問題はどういう風に解決したらよろしいのでしょうか?
どうかご助言のほうをよろしくお願いします。



370 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:35:11 ]
負荷とか関係なく、UIスレッドで通信しているのが原因の予感。
スレッドを分ければ一瞬で解決すると見た。

371 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:35:23 ]
別のスレッドで通信を処理すればいいんじゃね?

372 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:42:11 ]
UIスレッド?ですか
VB2008を使っているのですが、スレッドとはどういう事なのでしょうか?


373 名前:デフォルトの名無しさん [2009/07/06(月) 22:50:21 ]
マルチスレッドプログラミングってやつ
原則的に時間のかかる処理は別のスレッドを作ってそっちで動かさないとUIが固まります
特別な技術や注意が必要なのでしっかり勉強しましょう

374 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:51:31 ]
「ワーカースレッド」でMSDN を検索してこい。

375 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:58:14 ]

『.NETマルチスレッドプログラミング 1:スレッドの実行と同期』
codezine.jp/article/detail/144?p=1

『.NETマルチスレッドプログラミング 2:非同期デリゲートとスレッドプール』
codezine.jp/article/detail/139?p=1

376 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 04:24:03 ]
ありがとうございます
参考にさせていただきます

なんとなくマルチスレッドの動きは分かったんですが
このプログラムは送信はタイマーイベントで行っていて、受信はCOMのDataRecivedイベントで行っているのですが
この場合、>>369のように停止させたくはないので両メソッドともマルチスレッド化したほうがよろしいんでしょうか?
なかなか複雑そうですね・・。

377 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 07:47:52 ]
どうせDataReceivedはSerialPortが用意したスレッド上になるのだから、
データを格納した上でControl.BeginInvokeしておけば、
UIスレッドが原因で邪魔されることは無いんじゃないかな。

378 名前:376 mailto:sage [2009/07/07(火) 19:14:09 ]
>>377
>データを格納した上でControl.BeginInvokeしておけば、
>UIスレッドが原因で邪魔されることは無いんじゃないかな。
すみません・・・もう少し詳しく説明していただけませんでしょうか?

それと思ったのですが
現状のプログラムがDaraRecivedイベントが発生してデータを受け取ったら、そのデータのヘッダ等を確認するためにDaraRecivedイベント内で処理関数(*1)を呼び出して、最終的に変数にデータを格納する処理にしています
そしてフォームに配置したタイマーイベントで、その格納した変数にアクセスしデータを読み取るようにしています。
DaraRecivedイベントから呼び出した上記の(*1)の処理関数もDataRecivedイベントと同じスレッド、つまりフォームが実行されているスレッドとは別で実行されているということなんですよね?

ということは、既に受信処理は別のスレッドで処理されていたということなんですよね
この場合、フォームに配置したタイマーイベントで行っている送信処理のみがフォームと同スレッドな為にフォーム操作時に停止していると判断して
結果的には送信処理のみを別スレッドにすれば問題は解決しそうですね

マルチスレッドについては教わった解説サイトを見て調べるとして
・・・タイマーイベント内の、送信処理を別スレッドにするべきなんでしょうか
それともこのタイマーイベント自体を別スレッドにしないといけないんでしょうか?
タイマーイベントはフォームを操作したとして途切れることはないのかな

379 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:34:19 ]
送信処理を別スレッドにしてみて、改善されるか試してみなよ。
今後のことを考えれば、スレッド使えないと自分が大変なんだからさ。




380 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:46:17 ]
System.Timers.Timerの方を使えば、
勝手に手持ちのスレッドプールからイベントを起こしてくれるから、
スレッドを一から作る必要は無いんじゃないかな。
UIスレッドとは無関係にイベントは発生するから、止まる事も無いはず。

381 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:00:04 ]
Oracleと繋ぐときにOracle Clientを使わない方法って無いんですか?

382 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:02:18 ]
ODP.NETでもODBCでも

383 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:19:17 ]
>>382
ODP.NETやODBCだと、exeの配布先のマシンに
オラクルのクライアントがインストールされていなくても
SQLの実行などができますか?

384 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:25:49 ]
まさか

質問はちゃんと要件をまとめてからしてくれよ

385 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:31:15 ]
>>384
じゃ、exeの配布先のマシンには
Oracleのクライアントソフト(.Net)は必須なんですね?

386 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:34:17 ]
そもそも今現在受信処理と送信処理はちゃんと(うまく)同期とって動いてるの?


387 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:36:04 ]
Oracleのインストールは必須
.NETからOracleへのアクセスはSystem.Data.OracleClientやSystem.Data.Odbcなら標準ライブラリに用意されてる
> Oracleのクライアントソフト(.Net)
って何指してるの?

388 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:36:30 ]
Oracleのクライアントソフト(.Net)ってなんだよ。
Oracleのネイティブなクライアント(OCIとか)と
.NETのプロバイダは別物だぞ。

さらにDataDirectなどの、Oracleのネイティブなクライアントが
不要なプロバイダもあることはある。


389 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 22:39:23 ]
ありがとうございます。
納得しました。



390 名前:デフォルトの名無しさん [2009/07/08(水) 16:42:49 ]
VB2005でアプリを開発しています。
あるファイルが他のなんらかのアプリケーションで既に開かれているかどうかを調べるにはどうすれば良いでしょうか?
ファイル名から、そのファイルを開いているアプリケーションが何なのかを知りたいのです。

開発しているアプリからデータを既存のファイルに上書きでエクスポートしようとした時、
他のアプリでそのファイルが開かれていればエラーになってしまうので、どのアプリがその
ファイルを開いているかをユーザに通知したいのです。

どうぞよろしくお願いいたします。

391 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 16:49:29 ]
無理じゃないかな、ハンドルの継承とかあるし

392 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 17:01:02 ]
なんかAPIができたときいたことがある

393 名前:390 mailto:sage [2009/07/08(水) 17:28:25 ]
>>391
>>392
レスありがとうございます。

とりあえず現時点では「ファイルが他のアプリケーションで使用されていないことを確認してください。」と
メッセージボックスを表示しています。

たとえば、開発しているアプリから xls ファイルでエクスポートしてそのファイルが Excel で開かれていれば
ユーザは Excel というアプリを自分で確認してくれるのですが、別のアプリでその xls ファイルを読み込んで
いる場合、ユーザはその xls ファイルが開かれているということに気づきにくいみたいですので、どのアプリが
その xls ファイルを開いているのか通知したいんです...

openfiles というコマンドがあるみたいですが、これは非公開APIを使用しているかも...みたいな記述は
見かけました。
ただこのコマンドを使用するにはシステムのパフォーマンスが低下する可能性があるとの事(openfiles.exe が
ファイルのトレースを行うのでオーバーヘッドが発生)で、このコマンドを使用するには抵抗があります。
ttp://www.atmarkit.co.jp/fwin2ktips/306openfiles/openfiles.html

何か妙案はないかな...

394 名前:デフォルトの名無しさん [2009/07/08(水) 19:55:41 ]
使い終わったらOFFにすればいいんだろ

395 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 20:47:51 ]
>>393
technet.microsoft.com/ja-jp/sysinternals/bb896656(en-us).aspx

これはだめ?

396 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 20:51:10 ]
VB2008を使用しています。
Form1とForm2を作成し、Form1からForm2を以下のようにして表示させました。

[Class Main]
Public Sub Main()
Application.Run(New Form1)
End Sub

[Class Form1]
Private Sub Form1_Load( 略 )
Form2.Show()
End Sub

Public Sub SetTextBox( str )
TextBox1.Text = str
End Sub

[Class Form2]
Private Sub Button1_Click( 略 )
Form1.SetTextBox("test")
End Sub

このとき、Form2のボタンからForm1のTextBoxに文字列をセットできないのは
Application.RunでNewしているForm1にアクセス出来ていないからでしょうか?

397 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 20:56:46 ]
>>393
自分が開いてるかどうかなら
COM経由で開いてる文書一覧が取得できなかったっけ?

他PCが開いているかどうかなら
開かれていたらどうしたいのかによるんじゃね?
そもそもExcelが排他かけないんだし…


398 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:05:21 ]
>>396
よくわからんけど
Form1.TextBox.Text = "test"
は、ダメなの?

399 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:09:43 ]
>>396
VBは過去のしがらみにより、フォームのインスタンスを生成しなくても
フォームにアクセスできる。
この場合のフォームのインスタンスは、既定のインスタンスとか呼ばれてる
>Application.RunでNewしているForm1にアクセス出来ていないからでしょうか
その通り。Newすると、既定のインスタンスじゃないインスタンスが生成されてる
Form2が呼んでるForm1はインスタンス指定がないから既定のインスタンスのForm1
Application.Run(Form1)で既定のインスタンスのForm1を表示させれば思った通りの動作





400 名前:デフォルトの名無しさん [2009/07/08(水) 22:18:24 ]
過去のしがらみというか、オブジェクト指向がわからない人のためにVB2005になってわざわざ導入されたんだよ
VBユーザーは怒るべき

401 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 00:07:02 ]
>>396
2008は持っていないのですが、VB2005で実験してみたところ、普通に書き込みされました。

Public Class Main
  Public Form1 as new Form1
  Public Sub Main()
    Application.Run(Form1)
  End Sub
End Class
ってやってもダメだろうか。

実験その1
Public Class Main
  Public MyForm1 as new Form1
  Public Sub Main()
    Application.Run(MyForm1)
  End Sub
End Class

Public Class Form2
  Private Sub Button1_Click(略
    Form1.SetTextBox("test")
  End Sub
End Class

Form1は一緒ね。結果は、正常に?書き込み動作された。
MyForm1っていうForm1のインスタンスが、Form1って名前でアクセスできるみたい。
仕様としては嫌だなぁ。
続きます・・・









[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef