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 |
CentOSのアップグレードをかけたらIMEがchromeで効かなくなった・・・
export GTK_IM_MODULE=ibus export XMODIFIERS=@im=ibus export QT_IM_MODULE=ibus 修正後 export GTK_IM_MODULE=xim export XMODIFIERS=@im=ibus export QT_IM_MODULE=xim解決したなりー。 なんかこの記載方法を昔してダメだったような気がするのでバグが直った感じかな。 |
|
$gv=9686 $funcs = @( { echo "GlobalOnRead" $lv = $gv Write-Output $lv } , { echo "CopyOnWrite" $lv = $gv $lv += 5050 - 9686 Write-Output $lv } , { echo "LocalOnWrite" $lv = $gv $gv += 5050 - 9686 Write-Output ([String]$lv + ":" + $gv) } ) for($i = 0; $i -lt $funcs.length; $i++) { Write-Output $funcs[$i].invoke() }結果 GlobalOnRead 9686 CopyOnWrite 5050 LocalOnWrite 9686:-4636 PowerShellでのグローバル変数は参照のみ。 変数の値を書き込むやいなや、ローカル変数扱いとなる。 Pythonだとブロック内に書き込むロジックがある時点で ブロックの最初が参照だったらコンパイルエラーになった気がする。 もちろん、配列メンバへの更新はグローバル変数扱い! |
忍者ブログ [PR] |