Что нового

[Баг] Краш _NamedPipes_ConnectNamedPipe($hndlPipe,1)

AlexMerfi

Не курю
Сообщения
3
Репутация
0
Взял пример с другого форума. Если заменить
Код:
_NamedPipes_ConnectNamedPipe($hndlPipe,1)

на
Код:
_NamedPipes_ConnectNamedPipe($hndlPipe)

то при выполнении скрипта он вешает автоит. Нельзя снять задачу по клику значку.
Если оставить как есть то краш системы. Версия автоита последняя стабильная.

Код:
#Include <Misc.au3>
#Include <NamedPipes.au3>

Local Const $vzbEZ_PIPE_NAME = "\\.\pipe\vzbEZPipe"
   ;*********************************************
    ; Only the Pipe Server gets to the code below.
    ;*********************************************
    Local $hndlPipe
    Local $aPipeData[4]
    ; Create the named pipe. Get data from the pipe until a "DIE" message is received.
    $hndlPipe = _NamedPipes_CreateNamedPipe($vzbEZ_PIPE_NAME)
   If $hndlPipe <> -1 Then
;        Do
            ; wait for a client process to connect to an instance of a named pipe
         If _NamedPipes_ConnectNamedPipe($hndlPipe,1) Then
                $aPipeData = _NamedPipes_PeekNamedPipe($hndlPipe)
                $ff=FileOpen("alex.ddd",1)
            FileWriteLine($ff,$aPipeData[0])
            FileClose($ff)
                If Not _NamedPipes_DisconnectNamedPipe($hndlPipe) Then
                    ConsoleWrite(@LF & "Pipe Server:: DisconnectNamedPipe() Failed." & @LF)
                Endif
            Else
                ConsoleWrite(@LF & "Pipe Server:: connectNamedPipe() failed. " & @LF)
                Exit
            Endif
 ;       Until $aPipeData[0] == "DIE"
    Else
        ConsoleWrite(@LF & "Pipe Server:: _CreateNamedPipe() failed. " & @LF)
    Endif


Очень неудобно с пайпами работать.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AutoIt тут ни причем, так уж устроены pipes. Далее по пунктам:

  • AutoIt не зависает, он ждет соединения с клиентом.
  • Если не хочешь ждать, то используй параметр $iWait в функции _NamedPipes_CreateNamedPipe().
  • Крах скрипта происходит из за _NamedPipes_ConnectNamedPipe($hndlPipe, 1), так как параметр 1 тут вообще ни к месту (см. справку).
  • Вообще, для большинства задач достаточно WM_COPYDATA, зачем тебе вообще понадобились pipes? Если не секрет.
 
Автор
AlexMerfi

AlexMerfi

Не курю
Сообщения
3
Репутация
0
Я хотел написать в баг репорт, получилось для новичков. Изиняйте.
Этот код тоже ждет соединения с клиентом:
Код:
;  look for client connection
;--------------------
While 1
$ConnectedSocket = TCPAccept( $MainSocket)
If $ConnectedSocket >= 0 Then
	  while 1
	  $recv = TCPRecv($ConnectedSocket, 2048)
		If $recv <> "" Then ExitLoop
	WEnd
ExitLoop
EndIf
Wend

Но почему то как и везде если напрямую без компиляции запустить то скрипт можно остановить в любой момент.
Здесь же либо ctrl+enter либо закрытием процесса. Баг? Баг. Виноват автоит. Я тут ни при чем.
Раз параметр ($hndlPipe, 1) ни к месту, то можно было бы обработать ошибку. Не обработали, баг? баг.
Пайпы понадобились для решения задачи: 100 клиентов-процессов должны передать 1 различный параметр 100 серверам-процессам за мин. промежуток времени.
из 100 пайпов дохнет 1-2 после 5-6 прогона по передачи данных. Все корректно открывается завершается вместе с процессом, но остаются 2-3 процесса в памяти.
Тспсокеты также. 1-2 в памяти из 100 удачных.
вм копидата с окнами. а надо консоль. Остаются запись чтение рандомных имен файлов между процессами. И винт через месяц подохнет от чтения записи. Либо в рам диск сувать.
 
Верх