質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

5983閲覧

別スレッドからフォームへのコントロールアクセス

abanda

総合スコア12

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/02/23 16:02

.NET Framework4.5
言語:Visual Basic
Windowsフォームアプリケーション

いつもお世話になっております。
また皆様のお力を借りたく、質問させて頂きます。

色々なことの勉強の為にTCP通信を用いてクライアント側から文字が送信されたらサーバー側が返事をするようなアプリを作ろうとしています。

TCP通信をサブスレッドで行っており、サブスレッドからフォームのコントロールを操作して、テキストボックスに送受信文字を書き込みたいです。

メインスレッド、サブスレッドをあまり意識せずにテキストボックスに送受信文字を書き込めるようにしたい為、ネットのサンプルを流用し、モジュールにSetAppendTextというメソッドを作りました。

Public Sub SetAppendText(ByVal target As TextBox, ByVal value As String) Try 'Dim ac As New Action(Of String)(Sub(v) target.Text = v) Dim ac As New Action(Of String)(Sub(v) target.AppendText(v + vbCrLf)) If target.InvokeRequired Then target.Invoke(ac, New Object() {value}) Else ac(value) End If Catch ex As ObjectDisposedException Return End Try End Sub

↑のメソッドを使って、サブスレッド側でフォームと書き込みたい文字を引数に渡しているのですが、テキストボックスに表示されません。(Formクラスと別スレッドを開始しているクラスは別です。これを同じクラスにすると文字の書き込みは行われます。)

おそらく、渡している引数が悪いと思うのですが、いまひとつ原因がわかりません。

この質問内容だけではプログラム全体が把握できないと思うので、該当のプログラムをこちらからDLしてもらい見てもらえれば幸いです。↓
リンク内容(PASSWORD:今年の西暦4桁を数字で)

プロジェクトが二つ(クライアント側とサーバー側)入っています。
スタートボタンで接続を開始してもらい、クライアント側で何か文字を送っていただければ、クライアント側には送信文字と受信文字がテキストボックスに書き込まれると思います。

質問該当箇所(例)

'//ログの書き込み CommonMethod.SetAppendText(ServerForm.LogTextArea, "クライアントが接続しました。") CommonMethod.SetAppendText(ServerForm.LogTextArea, "接続停止 " + ex.ToString()) 'ログへの書き込み CommonMethod.SetAppendText(ServerForm.LogTextArea, "クライアントが切断されました。")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

さっと見た感じServerListen内で使用しているServerFormが別物として新たに作成されています。
このため、ServerStart内で使用されるServerFormは表示されているもの
ServerListen内で使用されるのは新たに作成された表示されていないServerFormとなっています。

別スレッドからはMy.MyProject.MyFormsを使うのではなく

VB.NET

1Private MainForm As ServerForm 2 3Public Sub New(UI As ServerForm) 4 MainForm = UI 5End Sub

と変数宣言、コンストラクタを作成し

VB.NET

1CommonMethod.SetAppendText(MainForm.LogTextArea, "クライアントが接続しました。")

と呼べばよいかと

また、今回の件とは直接関係がありませんが、TCPクラス内でフォーム側のデザインに左右されるような作りをしないほうが良いと思います。

投稿2017/02/23 23:17

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abanda

2017/02/24 11:29

前回質問に引き続き回答ありがとうございます! おかげさまでテキストボックスに書き込みができるようになりました。 だけど、”TCPクラス内でフォーム側のデザインに左右されるような作りをしないほうが良い”とはどういうことでしょうか?(フォーム側のデザインに左右されるとはいったい・・・) また、この場合はどういった作りにするのが良い作りといわれるのでしょうか? 重ねて質問になってしまい、申し訳ありませんが、よろしければ返答をお願いいたします。
YAmaGNZ

2017/02/24 12:50

今回の場合ですが、TCPクラスはServerFormというフォームやLogTextAreaというTextboxコントロール等がある前提で作成されています。 機能的にTCPクラスは通信を行うクラスですので、画面の更新は機能外となるわけです。 機能をしっかり分離しておけば、使いまわしの制限もなくなっていきます。 (現状ですとServerFormという型のフォームがあり、それにLogTextAreaというTextboxコントロールがないと使用できないクラスということになります) 例えば、TCPクラスで通信の待ち受けポートを設定しようとします。 フォーム上にポート番号を入力するテキストボックス(PortInputTextBox)があるとします。 TCPクラス内から port = From.PortInputTextBox.text と参照するのではなくて TCPクラスに Public Property Port() As Integer とプロパティを作り、フォームから TCP.Port = Integer.Parse(PortInputTextBox.Text) とすれば、TCPクラス側はコントロールの有無に左右されなくなります。 TCPクラスで受信したデータを画面に表示する場合は TCPクラスに Public Event DataRecived(data As String) と定義して、データ受信時に RaiseEvent DataRecived(recvData) とイベントを発生させます。 フォーム側で(Private WithEvents TCP As TCPClassと定義してあると仮定) Private Sub TCP_DataRecived(data As String) Handles TCP.DataRecived   LogTextbox.Text = data End Sub とすれば、TCPクラスはテキストボックスがあることを知らなくても良くなります。 (あくまで例なので、スレッド等は考慮してありません) こういった設計思想はいろいろなところで書かれていますから、調べてみるといいですよ。
abanda

2017/02/25 13:09

なるほど~ 機能分離をしっかりさせることが大事なのですす、勉強になります ありがとうございました また何かあればよろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問