fb:porticula NoPaste
connect_engines.bi
Uploader: | grindstone |
Datum/Zeit: | 16.11.2013 09:10:54 |
#Include Once "windows.bi"
Declare Function GetEngineWhiteResponse() As String
Declare Function ReadEngineWhiteInfo() As String
Declare Sub WriteEngineWhiteInfo(s As String)
Declare Function GetEngineBlackResponse() As String
Declare Function ReadEngineBlackInfo() As String
Declare Sub WriteEngineBlackInfo(s As String)
Dim As STARTUPINFO siWhite, siBlack
Dim As PROCESS_INFORMATION pi
Dim As SECURITY_ATTRIBUTES sa
Dim shared As HANDLE hReadChildPipeWhite, hWriteChildPipeWhite, hReadChildPipeBlack, hWriteChildPipeBlack
Dim Shared As HANDLE hReadPipeWhite, hWritePipeWhite, hReadPipeBlack, hWritePipeBlack
Dim Shared As String engineWhite, engineBlack
sa.nLength = SizeOf(SECURITY_ATTRIBUTES)
sa.lpSecurityDescriptor = NULL
sa.bInheritHandle = TRUE
engineWhite = "stockfish_4_32bit.exe"
engineBlack = "Fruit-2-3-1.exe"
CreatePipe(@hReadChildPipeWhite,@hWritePipeWhite,@sa,0)
SetHandleInformation(hWritePipeWhite,HANDLE_FLAG_INHERIT,0)
CreatePipe(@hReadPipeWhite,@hWriteChildPipeWhite,@sa,0)
SetHandleInformation(hReadPipeWhite,HANDLE_FLAG_INHERIT,0)
GetStartupInfo(@siWhite)
siWhite.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
siWhite.wShowWindow = SW_SHOW
siWhite.hStdOutput = hWriteChildPipeWhite
siWhite.hStdError = hWriteChildPipeWhite
siWhite.hStdInput = hReadChildPipeWhite
CreateProcess(0,engineWhite,0,0,TRUE,0,0,0,@siWhite,@pi)
CreatePipe(@hReadChildPipeBlack,@hWritePipeBlack,@sa,0)
SetHandleInformation(hWritePipeBlack,HANDLE_FLAG_INHERIT,0)
CreatePipe(@hReadPipeBlack,@hWriteChildPipeBlack,@sa,0)
SetHandleInformation(hReadPipeBlack,HANDLE_FLAG_INHERIT,0)
GetStartupInfo(@siBlack)
siBlack.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
siBlack.wShowWindow = SW_SHOW
siBlack.hStdOutput = hWriteChildPipeBlack
siBlack.hStdError = hWriteChildPipeBlack
siBlack.hStdInput = hReadChildPipeBlack
CreateProcess(0,engineBlack,0,0,TRUE,0,0,0,@siBlack,@pi)
CloseHandle(hWriteChildPipeWhite)
CloseHandle(hReadChildPipeWhite)
CloseHandle(hWriteChildPipeBlack)
CloseHandle(hReadChildPipeBlack)
Function ReadEngineWhiteInfo() As String
Dim As String g, sRet
g = GetEngineWhiteResponse() 'request a message from the engine
If InStrRev(g,"bestmove") Then 'the engine has finished the calculating for this move
sRet = Mid(g,InStrRev(g,"bestmove") + 9,5) 'isolate the data of the move
Return sRet 'send the move to the gui
Else
Return "err" 'in any other case send "err" to the gui
EndIf
End Function
Function GetEngineWhiteResponse() As String
Dim As Integer iTotalBytesAvail, iNumberOfBytesWritten, iBytesToRead
Dim As String sRet = "", sBuf
Const As Integer MaxBytesToRead = 4096 'maximum number of bytes to be returned at one 'ReadFile'-operation
Do
sBuf = "" 'clear buffer
PeekNamedPipe(hReadPipeWhite,NULL,NULL,NULL,@iTotalBytesAvail,NULL) 'find out if there's any data in the pipe
If iTotalBytesAvail Then 'pipe is not empty
If iTotalBytesAvail < MaxBytesToRead Then
iBytesToRead = iTotalBytesAvail 'set all available bytes to be read
Else
iBytesToRead = MaxBytesToRead 'set the first 4096 bytes to be read
EndIf
sBuf = String(iBytesToRead,Chr(0)) 'set the length of the buffer string to the necessary value
ReadFile(hReadPipeWhite,StrPtr(sBuf),iBytesToRead,@iNumberOfBytesWritten,NULL) 'read the specified amount of bytes from the pipe
sRet += sBuf 'add the buffer to the return string
Sleep 1
Else 'pipe is empty
Exit Do 'return
EndIf
Loop
Return sRet
End Function
Sub WriteEngineWhiteInfo(s As String)
Dim As Integer iNumberOfBytesWritten, x
Dim As String sBuf
sBuf = s + Chr(10)
WriteFile(hWritePipeWhite,StrPtr(sBuf),Len(sBuf),@iNumberOfBytesWritten,NULL)
Sleep 1500
End Sub
Function ReadEngineBlackInfo() As String
Dim As String g, sRet
g = GetEngineBlackResponse() 'request a message from the engine
If InStrRev(g,"bestmove") Then 'the engine has finished the calculating for this move
sRet = Mid(g,InStrRev(g,"bestmove") + 9,5) 'isolate the data of the move
Return sRet 'send the move to the gui
Else
Return "err" 'in any other case send "err" to the gui
EndIf
End Function
Function GetEngineBlackResponse() As String
Dim As Integer iTotalBytesAvail, iNumberOfBytesWritten, iBytesToRead
Dim As String sRet = "", sBuf
Const As Integer MaxBytesToRead = 4096 'maximum number of bytes to be returned at one 'ReadFile'-operation
Do
sBuf = "" 'clear buffer
PeekNamedPipe(hReadPipeBlack,NULL,NULL,NULL,@iTotalBytesAvail,NULL) 'find out if there's any data in the pipe
If iTotalBytesAvail Then 'pipe is not empty
If iTotalBytesAvail < MaxBytesToRead Then
iBytesToRead = iTotalBytesAvail 'set all available bytes to be read
Else
iBytesToRead = MaxBytesToRead 'set the first 4096 bytes to be read
EndIf
sBuf = String(iBytesToRead,Chr(0)) 'set the length of the buffer string to the necessary value
ReadFile(hReadPipeBlack,StrPtr(sBuf),iBytesToRead,@iNumberOfBytesWritten,NULL) 'read the specified amount of bytes from the pipe
sRet += sBuf 'add the buffer to the return string
Sleep 1
Else 'pipe is empty
Exit Do 'return
EndIf
Loop
Return sRet
End Function
Sub WriteEngineBlackInfo(s As String)
Dim As Integer iNumberOfBytesWritten, x
Dim As String sBuf
sBuf = s + Chr(10)
WriteFile(hWritePipeBlack,StrPtr(sBuf),Len(sBuf),@iNumberOfBytesWritten,NULL)
Sleep 1500
End Sub