BeginAcceptTcpClientについて、スレッドIDを取得してみた。
子スレッドは2つまで?うむむ。 ソース Imports System.Net.Sockets Imports System.Threading Public Class TestNet ' Thread signal. Public Shared tcpClientConnected As New ManualResetEvent(False) Public Shared Sub dp(s As String, ParamArray a() As String) SyncLock tcpClientConnected Debug.Print(s, a) End SyncLock End Sub Public Sub TestServerAndClient() Dim client As Thread Dim procClient As Action(Of Byte) _ = Sub(aByte As Byte) client = New Thread(New ThreadStart(Sub() Thread.Sleep(1000) Dim sckClient As TcpClient sckClient = New TcpClient() dp("cl connect {0}-{1}", Now, aByte) sckClient.Connect(Net.IPAddress.Loopback, 9000) sckClient.GetStream().WriteByte(aByte) End Sub)) client.Start() End Sub procClient(0) procClient(1) procClient(2) procClient(3) procClient(4) Dim tl As TcpListener = New TcpListener(Net.IPAddress.Loopback, 9000) tl.Start(3) DoBeginAcceptTcpClient(tl) dp("sv connect") DoBeginAcceptTcpClient(tl) dp("sv connect") DoBeginAcceptTcpClient(tl) dp("sv connect") DoBeginAcceptTcpClient(tl) dp("sv connect") DoBeginAcceptTcpClient(tl) dp("sv connect") End Sub Public Shared Sub DoBeginAcceptTcpClient(listener As TcpListener) tcpClientConnected.Reset() listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf DoAcceptTcpClientCallback), listener) tcpClientConnected.WaitOne() End Sub Public Shared Sub DoAcceptTcpClientCallback(ar As IAsyncResult) Dim listener As TcpListener = CType(ar.AsyncState, TcpListener) Dim client As TcpClient = listener.EndAcceptTcpClient(ar) tcpClientConnected.Set() Dim bt As Byte = client.GetStream().ReadByte() dp("child accept {0}-{1} Start {2}", Now, bt, Thread.CurrentThread.ManagedThreadId) Thread.Sleep(3000) dp("child accept {0}-{1} End", Now, bt) client.GetStream().Close() End Sub End Class cl connect 2018/03/21 5:46:56-1 cl connect 2018/03/21 5:46:56-2 cl connect 2018/03/21 5:46:56-3 cl connect 2018/03/21 5:46:56-4 スレッド 0x514 はコード 0 (0x0) で終了しました。 スレッド 0x126c はコード 0 (0x0) で終了しました。 スレッド 0x600 はコード 0 (0x0) で終了しました。 child accept 2018/03/21 5:46:57-1 Start 16 スレッド 0x1384 はコード 0 (0x0) で終了しました。 sv connect cl connect 2018/03/21 5:46:56-0 child accept 2018/03/21 5:46:57-2 Start 9 スレッド 0x2948 はコード 0 (0x0) で終了しました。 child accept 2018/03/21 5:47:00-1 End child accept 2018/03/21 5:47:00-2 End sv connect child accept 2018/03/21 5:47:00-3 Start 9 child accept 2018/03/21 5:47:03-3 End sv connect child accept 2018/03/21 5:47:03-4 Start 9 child accept 2018/03/21 5:47:06-4 End sv connect child accept 2018/03/21 5:47:06-0 Start 9 child accept 2018/03/21 5:47:09-0 End sv connect プログラム '[6396] NetTest.vshost.exe' はコード -1 (0xffffffff) で終了しました。 PR |
EndAcceptTcpClientごとにスレッドが作成されるのかと思ったら、1スレッドしか作成できないらしい。何のための非同期なんだろう。。。1つ目のTcpClient作成後に、別の要求があっても2つ目のスレッドは作成されないで1つ目のTcpClientが終了するまでコールバックが呼ばれない。。。うむむ。
Public Sub run() Dim socks As clsSocket() = New clsSocket(1) {} Dim waits As Threading.WaitHandle() = New Threading.WaitHandle(socks.Length - 1) {} Debug.Print(Threading.Thread.CurrentThread.ManagedThreadId) mServer.Start(socks.Length - 1) Do For i As Integer = 0 To socks.Length - 1 Dim wrkIdx As Integer = i If waits(wrkIdx) Is Nothing Then socks(wrkIdx) = New clsSocket(mIGetMessage) waits(wrkIdx) = mServer.BeginAcceptTcpClient(Sub(aISyncResult As IAsyncResult) Debug.Print(Threading.Thread.CurrentThread.ManagedThreadId) socks(wrkIdx).Begin(mServer.EndAcceptTcpClient(aISyncResult).GetStream()) End Sub, Nothing).AsyncWaitHandle End If Next waits(Threading.EventWaitHandle.WaitAny(waits)) = Nothing Loop End Sub |
おもしろい。
R・G・Bを座標軸として捕まえて、 それぞれの最小・最大値を格納する直方体を考え、 これをCubeと名づける。 一番長い辺に垂直にミディアンの位置でCubeを切る。 Cubeが2つに分かれたら同じことを全Cubeの中で一番長い辺を対象に切る。 まさにキャベツの千切りで万遍なく同じ大きさの色にある個数まで分断するまで切る。 でもこのやり方だとCubeの色はCube内のデータの平均で決まるため 白色とか端っこのCubeが濁ってしまう。 ここら辺は分散値を使って重みごとに割り当て色数を分断すればいいなと 思ったら似たようなのが上がってた。 普通にみんな考えるわな・・・。 |
|
|
| ホーム |
忍者ブログ [PR] |