Thanks from an original code of INFRATEC for PhantomJS,
viewtopic.php?p=481800#p481800
I try to remote the STDOUT of NodeJS, and obviously, if i write here...that not works
In fact that work in script mode or even in eval script mode
Code: Select all
*ThreadParameter\ProgramID = RunProgram(CheminNodeJS$ + "node.exe", "-e " + Chr(34) + "process.stdout.write('Kcc')" + Chr(34), CheminNodeJS$, #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Error|#PB_Program_UTF8);
Code: Select all
;*ThreadParameter\ProgramID = RunProgram(CheminNodeJS$ + "node.exe", "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Error|#PB_Program_UTF8);
https://stackoverflow.com/questions/349 ... andard-out
But nothing out for me> var a = "lol";
undefined
> process.stdout.write(a);
loltrue
Code: Select all
; [Infratec] https://www.purebasic.fr/english/viewtopic.php?p=481800#p481800
CompilerIf Not #PB_Compiler_Thread
MessageRequester("Info", "Enable Thread-Safe in compiler options!")
End
CompilerEndIf
Enumeration
#Form0
#EditorCommande
#StringCommande
#Bouton
EndEnumeration
Enumeration #PB_Event_FirstCustomValue
#Own_Event_FromProg
#Own_Event_Exit
EndEnumeration
Structure ThreadParameterStructure
Semaphore.i
Thread.i
ProgramID.i
FromProg$
ToProg$
Exit.i
EndStructure
Global CheminNodeJS$ = GetPathPart(ProgramFilename()) + "NodeJs8.12.0\"
Global Event.i, Exit.i
Global ThreadParameter.ThreadParameterStructure
Procedure HandleIO(*ThreadParameter.ThreadParameterStructure)
Protected ReadLen.i, WriteLen.i, Error$
*Buffer = AllocateMemory(1024)
If *Buffer
;*ThreadParameter\ProgramID = RunProgram(CheminNodeJS$ + "node.exe", "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Error|#PB_Program_UTF8);|#PB_Program_Hide)
*ThreadParameter\ProgramID = RunProgram(CheminNodeJS$ + "node.exe", "-e " + Chr(34) + "process.stdout.write('Kcc')" + Chr(34), CheminNodeJS$, #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Error|#PB_Program_UTF8);
If *ThreadParameter\ProgramID
Repeat
ReadLen = AvailableProgramOutput(*ThreadParameter\ProgramID)
If ReadLen
ReadLen = ReadProgramData(*ThreadParameter\ProgramID, *Buffer, ReadLen)
If ReadLen
*ThreadParameter\FromProg$ = PeekS(*Buffer, ReadLen, #PB_UTF8)
PostEvent(#Own_Event_FromProg)
WaitSemaphore(*ThreadParameter\Semaphore)
EndIf
EndIf
Error$ = ReadProgramError(*ThreadParameter\ProgramID, #PB_UTF8)
If Len(Error$)
*ThreadParameter\FromProg$ = Error$
PostEvent(#Own_Event_FromProg)
WaitSemaphore(*ThreadParameter\Semaphore)
EndIf
If Len(*ThreadParameter\ToProg$)
*ThreadParameter\ToProg$ + #CRLF$
WriteLen = PokeS(*Buffer, *ThreadParameter\ToProg$, -1, #PB_UTF8)
*ThreadParameter\ToProg$ = ""
WriteLen = WriteProgramData(*ThreadParameter\ProgramID, *Buffer, WriteLen)
SignalSemaphore(*ThreadParameter\Semaphore)
EndIf
Delay(10)
Until *ThreadParameter\Exit Or Not ProgramRunning(*ThreadParameter\ProgramID)
CloseProgram(*ThreadParameter\ProgramID)
EndIf
FreeMemory(*Buffer)
EndIf
PostEvent(#Own_Event_Exit)
EndProcedure
OpenWindow(#Form0, 379, 176, 608, 542, "Remote NodeJS", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
EditorGadget(#EditorCommande, 5, 15, 593, 447)
StringGadget(#StringCommande, 6, 469, 594, 23, "process.stdout.write('Kcc');")
ButtonGadget(#Bouton, 211, 503, 201, 33, "Send to NodeJS")
ThreadParameter\Semaphore = CreateSemaphore()
ThreadParameter\Thread = CreateThread(@HandleIO(), @ThreadParameter)
Repeat
Event = WaitWindowEvent()
Select Event
Case #Own_Event_FromProg
AddGadgetItem(#EditorCommande, -1, ThreadParameter\FromProg$)
SignalSemaphore(ThreadParameter\Semaphore)
Case #Own_Event_Exit
; Exit = #True
Case #PB_Event_Gadget
Select EventGadget()
Case #Bouton
ThreadParameter\ToProg$ = GetGadgetText(#StringCommande)
WaitSemaphore(ThreadParameter\Semaphore)
EndSelect
Case #PB_Event_CloseWindow
If IsThread(ThreadParameter\Thread)
CloseProgram(ThreadParameter\ProgramID)
EndIf
FreeSemaphore(ThreadParameter\Semaphore)
Exit = #True
EndSelect
Until Exit
Have a good day