忍者ブログ
  • 2024.12«
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • » 2025.02
重複して始まらないBeginAcceptTcpClient その2
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) で終了しました。

拍手[0回]

PR
【2018/03/21 06:01 】 | javascript | 有り難いご意見(3)
重複して始まらないBeginAcceptTcpClient
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

拍手[0回]

【2018/03/18 13:48 】 | javascript | 有り難いご意見(2)
CentOS7 + ibus
CentOSのアップグレードをかけたらIMEがchromeで効かなくなった・・・


【引用】ibus-based IMEs may not work with Google Chrome after rebooting the computer
修正前

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
解決したなりー。
なんかこの記載方法を昔してダメだったような気がするのでバグが直った感じかな。

拍手[0回]

【2017/08/21 10:39 】 | 未選択 | 有り難いご意見(0)
コンパネに行けないWin10 アップデート
衝撃を受けた。 メニュー右クリックからコンパネが消えた。 同じこと思っている人がいたので1票入れておいたなり。

拍手[0回]

【2017/08/18 20:24 】 | 未選択 | 有り難いご意見(0)
LocalOnWrite on PowerShell
$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だとブロック内に書き込むロジックがある時点で
ブロックの最初が参照だったらコンパイルエラーになった気がする。

もちろん、配列メンバへの更新はグローバル変数扱い!

拍手[0回]

【2016/12/21 06:35 】 | PowerShell | 有り難いご意見(0)
前ページ | ホーム | 次ページ

忍者ブログ [PR]