Heute ist bei mir irgendwie Tag der seltsamen Bugs...
Da ich seither zwischen meinen Teil Programmen der Einfachheit halber nur per Textdateien kommuniziert habe und das nun endlich mal ändern möchte habe ich mich mal näher damit beschäftigt per Stdin/Stdout zu kommunizieren. Soweit so gut, funktioniert soweit ich das beurteilen kann auch alles. Dabei ist mir jedoch aufgefallen, dass alle unabgängig voneinander laufenden Prozesse exakt die gleichen random Werte produzieren. Hier mal die beiden Testscripte:
Main.au3:
Spoiler anzeigen
#include <Constants.au3>
#include <array.au3>
Global $thread[4]
Global $line[4]
$thread[1] = Run(@ScriptDir & "\stdout3.exe 1","",@SW_HIDE,$STDIN_CHILD + $STDOUT_CHILD)
$thread[2] = Run(@ScriptDir & "\stdout3.exe 2","",@SW_HIDE,$STDIN_CHILD + $STDOUT_CHILD)
$thread[3] = Run(@ScriptDir & "\stdout3.exe 3","",@SW_HIDE,$STDIN_CHILD + $STDOUT_CHILD)
;_ArrayDisplay($thread)
;MsgBox(0,"","wait a sec")
Sleep(500)
For $i=1 to 3
$line[$i] = StdoutRead($thread[$i])
if StringInStr($line[$i],"thread started") Then
ConsoleWrite($line[$i])
StdinWrite($thread[$i],"start work")
EndIf
Next
;~ ConsoleWrite(@CRLF & "------------ WAITING SOME TIME ------------" & @CRLF & @CRLF)
;~ Sleep(15000)
$done=0
do
for $i = 1 to 3
if $line[$i]=-1 then ContinueLoop
$line[$i] = StdoutRead($thread[$i])
if $line[$i] <> "" Then ConsoleWrite($line[$i])
if StringInStr($line[$i],"work done") Then
$done += 1
$line[$i]=-1
EndIf
Next
Until $done=3
;MsgBox(0,"","worker scheint fertig zu sein...")
For $i = 1 to 3
StdinWrite($thread[$i],"exit")
$line[$i]=""
Next
$done = 0
do
For $i = 1 to 3
if $line[$i]=-1 then ContinueLoop
$line[$i] = StdoutRead($thread[$i])
if $line[$i] <> "" Then ConsoleWrite($line[$i])
if StringInStr($line[$i],"exited by master") Then
$done += 1
$line[$i]=-1
EndIf
Next
Until $done =3
;MsgBox(0,"","thread ist nun beendet")
Stdout3.au3 (muss kompiliert werden)
Spoiler anzeigen
$threadident = $cmdline[1]
ConsoleWrite("thread started " & $threadident & @CRLF)
[/autoit] [autoit][/autoit] [autoit]do
Sleep(100)
until StringInStr(ConsoleRead(),"start work")
worktodo()
ConsoleWrite("work done " & $threadident & @CRLF)
do
Sleep(100)
until StringInStr(ConsoleRead(),"exit")
;MsgBox(0,"aus dem thread","thread wurde vom master beendet")
ConsoleWrite("exited by master " & $threadident & @CRLF)
Sleep(1000)
Exit
Func worktodo()
Local $ergebnis=0
for $i=1 to 10
Sleep(1000)
$ergebnis += $i* $ergebnis + random(1000,9999,1)
;$ergebnis += $i* $ergebnis + _random()
consolewrite("I am working (" & $ergebnis & ")! " & $threadident & @CRLF)
Next
EndFunc
func _random()
Local $random = 1
$random = Random($threadident,$threadident*2000,1)
Return $random
EndFunc
Benutzt man die von mir modifizierte Random Funktion, welche den eindeutigen Threadidentifier verwendet ergeben sich wirkliche random Werte, benutzt man nur die normale random Funktion erhält man dieses consolen output der main.au3:
Spoiler anzeigen
thread started 1
thread started 2
thread started 3
I am working (9501)! 2
I am working (9501)! 3
I am working (9501)! 1
I am working (32535)! 2
I am working (32535)! 1
I am working (32535)! 3
I am working (134756)! 2
I am working (134756)! 1
I am working (134756)! 3
I am working (677221)! 2
I am working (677221)! 3
I am working (677221)! 1
I am working (4065423)! 2
I am working (4065423)! 3
I am working (4065423)! 1
I am working (28465907)! 2
I am working (28465907)! 3
I am working (28465907)! 1
I am working (227732611)! 2
I am working (227732611)! 3
I am working (227732611)! 1
I am working (2049597721)! 2
I am working (2049597721)! 3
I am working (2049597721)! 1
I am working (20495980982)! 2
I am working (20495980982)! 3
I am working (20495980982)! 1
I am working (225455799039)! 2
work done 2
I am working (225455799039)! 3
work done 3
I am working (225455799039)! 1
work done 1
exited by master 2
exited by master 3
exited by master 1
Alles anzeigen
Auch hier die Frage an euch wie sowas sein kann...