Что нового

Как обойти ограничение размера переменной 32767 ?

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
liond66 [?]
API и DLL функции не использую
А как же это?
в конце каждого цикла запускаю _WinApi_EmptyWorkingSet
Кстати, ознакомьтесь с особенностями работы этой функции: Ответ #6

вылетел с ошибкой "aut2exe has stopped working"
Какое отношение имеет aut2exe к выполнению скрипта? Вы там динамической компиляцией балуетесь? ;)

создаётся график
Какими средствами? Убедитесь, что все графические объекты удалены после использования.

Логи обрабатываются
Проверьте закрытие всех файлов после обработки.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
InnI

_WinApi_EmptyWorkingSet был добавлен в последние дни в попытке решить проблему.

InnI сказал(а):
Какое отношение имеет aut2exe к выполнению скрипта?

Мне кажется (сейчас проверить не могу), что в Task Manager Windows 10 кроме названия скрипта в отдельном столбике значится имя компилятора aut2exe. Видимо это имя и появляется в сообщении об ошибке. Или он вшит в скомпилированном файле...

InnI сказал(а):
Вы там динамической компиляцией балуетесь? ;)

Надеюсь, что нет :smile:. Я не знаю как это...
График создаётся позже, до этого дело не доходит.
Все файлы закрываю. Перед закрытием добавил на всякий случай FileFlush.

OffTopic:
Не могу найти кнопку "Вставить ник". Написал вручную.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
OffTopic:
В режиме просмотра сообщений, при нажатии на ник ничего не происходит.
В режиме ответа - ник не активный элемент, кликнуть не получается
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
OffTopic:
liond66, быстрый ответ
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
OffTopic:
Tempo, Не плохо, но нет значка [?] после ника.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
В очередной раз программа упала через 48 часов с сообщением "Allocation memory error".
Запускал без компиляции, через SciTE (версия 3.7.3). Получил ExitCode=1.
Я понимаю, что дальше без кода просить помощи бесполезно. Прилагаю код основных функций.
Немного объяснений: запускается GUI с системной информацией и счётчиками:
счётчик общего кол-ва циклов первой программы SB (уникальная программа для предприятия, написана на Java),
счётчик удачно пройденных циклов SB, и неудачных, счётчик процента неудачных циклов.
За один цикл SB успевает запуститься несколько раз вторая программа Iperf https://ru.wikipedia.org/wiki/Iperf , причём в пяти экзэмплярах для проверки пяти сетевых карт. Получаеся на один цикл SB приходится в общем 30 циклов Iperf.
В GUI присутствуют соответственно счётчики Iperf: удачный цикл, неудачный, процент неудач.
При нажатии кнопки старт запускается функция Work, и из неё уже другие функции. Привожу код с некоторыми сокращениями.

Функция Work:
Код:
Func _Work()
MsgBox..........
...........................
$iStop = 0
		$L = 0
		$PausedTimer = 0
		$Init0 = TimerInit()
		AdlibRegister("_Show_timer", 60); таймер выполнения
		Sleep(500)
		;обнуление счетчиков, вытирание хвостов
		GUICtrlSetData($IperfT1, $g)
		GUICtrlSetData($IperfT2, $p)
		FileDelete($sFileX1)
		FileDelete($sFileX2)
		FileDelete($sFileX3)
		FileDelete($sFileX4)
		FileDelete($sFileX5)
		While $iStop = 0 ; цикл прерывается изменением $iStop по нажатию горячей кнопки
			GUICtrlSetData($Test2, "")
			GUICtrlSetData($Test3, "")
			GUICtrlSetBkColor($Test2, 0xffffff)
			GUICtrlSetBkColor($Test3, 0xffffff)
			_TEST()
			;изменяется счётчик успешого или неуспешного цикла SB
			If $ErrorLoop = 1 Then
				$ELoop += 1
				GUICtrlSetData($sbT2, $ELoop)
				GUICtrlSetBkColor($sbT2, 0xFF0000)
			EndIf
			If $GoodLoop = 1 Then
				$GLoop += 1
				GUICtrlSetData($sbT1, $GLoop)
				GUICtrlSetBkColor($sbT1, 0x00FF00)
			EndIf
			;высчитывается процент неуспешных циклов
			$sbR1 = GUICtrlRead($sbT1)
			$sbR2 = GUICtrlRead($sbT2)
			If ($sbR1 > 0 And $sbR2 > 0) Then
				Local $A1 = $sbR2 * 100 / ($sbR1 + $sbR2)
				Local $A2 = StringRegExpReplace($A1, '(\.\d*)', '')
				GUICtrlSetData($Percentsb, $A2)
			ElseIf ($sbR1 > 0 And $sbR2 = 0) Then
				GUICtrlSetData($Percentsb, "0")
			ElseIf ($sbR1 = 0 And $sbR2 > 0) Then
				GUICtrlSetData($Percentsb, "100")
			EndIf
			;общий счётчик циклов
			$L += 1
			GUICtrlSetData($Loops, $L)
			Sleep(1000)
			;;; test swap
			_WinAPI_EmptyWorkingSet()
		WEnd
EndFunc   ;==>_Work
Функция Test:
Код:
Func _TEST()
	GUICtrlSetData($Test2, "wait...")
	GUICtrlSetData($Test3, "wait...")
	;;;;;;;;; for SB
	If Not WinExists("SB:    MAINTENANCE MODE") Then
		Run('c:\tester\SB_Win10\SB.exe', 'C:\tester\SB_Win10')
		WinWaitActive("[Title:SB:    MAINTENANCE MODE]")
		WinMove("[Title:SB:    MAINTENANCE MODE]", "", 0, 0, 760, 500)
	Else
		WinActivate("[Title:SB:    MAINTENANCE MODE]")
		WinMove("[Title:SB:    MAINTENANCE MODE]", "", 0, 0, 760, 500)
	EndIf
	Sleep(3000)
	;запуск первой программы SB
	$but = ControlGetText("[TITLE:SB:    MAINTENANCE MODE]", '', 'Button2')
	If $but = "Clear" Then
		ControlClick("[TITLE:SB:    MAINTENANCE MODE]", '', 'Button2')
		Sleep(1000)
		ControlSetText("[TITLE:SB:    MAINTENANCE MODE]", '', 'Edit1', '1', 0)
		Sleep(500)
		ControlClick("[TITLE:SB:    MAINTENANCE MODE]", '', 'Button2')
	EndIf
	If $but = "Run" Then
		ControlSetText("[TITLE:SB:    MAINTENANCE MODE]", '', 'Edit1', '1', 0)
		Sleep(1000)
		ControlClick("[TITLE:SB:    MAINTENANCE MODE]", '', 'Button2')
	EndIf

	$h = 0
	While $h = 0 ; запуск второй программы Iperf в пяти экзэмплярах
		If $ExistIperfServer = 0 Then
			$j1 = @ComSpec & ' /c c:\tester\iperf-2.0.9-win32\iperf.exe -c ' & $IP & ' -p 5001 -u -b 100m -B 192.168.1.101'
			$j2 = @ComSpec & ' /c c:\tester\iperf-2.0.9-win32\iperf.exe -c ' & $IP2 & ' -p 5002 -u -b 100m -B 192.168.2.102'
			$j3 = @ComSpec & ' /c c:\tester\iperf-2.0.9-win32\iperf.exe -c ' & $IP3 & ' -p 5003 -u -b 100m -B 192.168.3.103'
			$j4 = @ComSpec & ' /c c:\tester\iperf-2.0.9-win32\iperf.exe -c ' & $IP4 & ' -p 5004 -u -b 100m -B 192.168.4.104'
			$j5 = @ComSpec & ' /c c:\tester\iperf-2.0.9-win32\iperf.exe -c ' & $IP5 & ' -p 5005 -u -b 100m -B 192.168.5.105'
			$pro1 = Run($j1, @ScriptDir, @SW_HIDE, $STDERR_MERGED)
			Sleep(500)
			$pro2 = Run($j2, @ScriptDir, @SW_HIDE, $STDERR_MERGED)
			Sleep(500)
			$pro3 = Run($j3, @ScriptDir, @SW_HIDE, $STDERR_MERGED)
			Sleep(500)
			$pro4 = Run($j4, @ScriptDir, @SW_HIDE, $STDERR_MERGED)
			Sleep(500)
			$pro5 = Run($j5, @ScriptDir, @SW_HIDE, $STDERR_MERGED)
			ProcessWaitClose($pro1)
			ProcessWaitClose($pro2)
			ProcessWaitClose($pro3)
			ProcessWaitClose($pro4)
			ProcessWaitClose($pro5)
			;запись результатов в лог. При сбое программы здесь начинают писаться пустые логи...
			$Out5 = StdoutRead($pro1)
			FileOpen($sFileX1, 1)
			FileWrite($sFileX1, $Out5 & @CRLF)
			FileFlush($sFileX1)
			FileClose($sFileX1)

			$Out6 = StdoutRead($pro2)
			FileOpen($sFileX2, 1)
			FileWrite($sFileX2, $Out6 & @CRLF)
			FileFlush($sFileX2)
			FileClose($sFileX2)

			$Out7 = StdoutRead($pro3)
			FileOpen($sFileX3, 1)
			FileWrite($sFileX3, $Out7 & @CRLF)
			FileFlush($sFileX3)
			FileClose($sFileX3)

			$Out8 = StdoutRead($pro4)
			FileOpen($sFileX4, 1)
			FileWrite($sFileX4, $Out8 & @CRLF)
			FileFlush($sFileX4)
			FileClose($sFileX4)

			$Out9 = StdoutRead($pro5)
			FileOpen($sFileX5, 1)
			FileWrite($sFileX5, $Out9 & @CRLF)
			FileFlush($sFileX5)
			FileClose($sFileX5)
			;обработка логов iperf
			Sleep(3000)
			_IPERFLog1()
			Sleep(1000)
			_IPERFLog2()
			Sleep(1000)
			_IPERFLog3()
			Sleep(1000)
			_IPERFLog4()
			Sleep(1000)
			_IPERFLog5()
			Sleep(1000)
		EndIf
		;;;;;;;;; check Pixel
		;изменение цвета обозначает окончание работы SB, иначе повторное выпонение Iperf
		Local $aCoord = PixelSearch(400, 65, 470, 80, 0x3A6EA5)
		If Not @error Then
			Sleep(2000)
		Else
		;остановка цикла для SB по $h = 1, удачный или неудачный цикл SB
			$but = ControlGetText("[TITLE:SB:    MAINTENANCE MODE]", '', 'Button2')
			If $but = "Stop" Then
				Sleep(2000)
			Else
				Local $iColor = PixelGetColor(420, 75)
				If $iColor = 0xFF6464 Then
					$ErrorLoop = 1
					$GoodLoop = 0
					$h = 1
				ElseIf $iColor = 0xF0F0F0 Then
					$GoodLoop = 1
					$ErrorLoop = 0
					$h = 1
				Else
					;MsgBox(0, "Warning", "SB window not found. Not possible check loop result!")
					$ErrorLoop = 1
					$GoodLoop = 0
					$h = 1
				EndIf
			EndIf
		EndIf
	WEnd

	_CopySBLog(); обработка лога SB
	Sleep(5000)

	GUICtrlSetData($Test2, "Complete")
	GUICtrlSetBkColor($Test2, 0x00BFFF)
	GUICtrlSetData($Test3, "Complete")
	GUICtrlSetBkColor($Test3, 0x00BFFF)
EndFunc   ;==>_TEST
Функция Iperf1. Аналогично функции Iperf2,Iperf3, Iperf4,Iperf5. Меняются только циферки 11, 111 на 22, 222 и т.д. в названиях переменных
Код:
Func _IPERFLog1(); парсинг лога
	$nSize1 = 0
	$nSize11 = FileGetSize($sFileX1)
	If $nSize11 > $nSize1 Then
		$LineCount11 = _FileCountLines($sFileX1)
		$e = 0
		For $i = ($LineCount1 + 1) To $LineCount11
			$text = FileReadLine($sFileX1, $i)

			$Rep1[$e] = $text ; если не получен ответ с сервера (в логе нет стрчки "Server Report"), то $poor+1
			;также в случае сбоя скрипта и ,как результат, пустой лог !
			$e += 1
			If StringInStr($text, "Server Report") Then
				$text2 = FileReadLine($sFileX1, $i + 1)
				Local $aNumbers11 = StringSplit($text2, ' ')
				$Mas11 = $aNumbers11

				;del empty lines from array
				Local $Mas111[1]
				$k = 0
				For $j = 0 To UBound($Mas11) - 1
					If $Mas11[$j] = "" Then ContinueLoop
					ReDim $Mas111[$k + 1]
					$Mas111[$k] = $Mas11[$j]
					$k += 1
				Next
				; end delete

				$Pr1 = Round($Mas111[12])
				If $Pr1 < $PercentMax Then
					$g += 1
					GUICtrlSetData($IperfT1, $g)
					GUICtrlSetBkColor($IperfT1, 0x00FF00)
				Else
					$p += 1
					GUICtrlSetData($IperfT2, $p)
					GUICtrlSetBkColor($IperfT2, 0xFF0000)
				EndIf
			Else
				ContinueLoop
			EndIf
			;изменение счётчиков удачного/неудачеого цикла Iperf
			$IperfR1 = GUICtrlRead($IperfT1)
			$IperfR2 = GUICtrlRead($IperfT2)
			If ($IperfR1 > 0 And $IperfR2 > 0) Then
				Local $BB1 = $IperfR2 * 100 / ($IperfR1 + $IperfR2)
				Local $BB2 = Round($BB1, 2)
				GUICtrlSetData($PercentIperf, $BB2)
			ElseIf ($IperfR1 > 0 And $IperfR2 = 0) Then
				GUICtrlSetData($PercentIperf, "0")
			ElseIf ($IperfR1 = 0 And $IperfR2 > 0) Then
				GUICtrlSetData($PercentIperf, "100")
			EndIf
		Next
		;_ArrayDisplay($Rep, "BEFORE deletion")
		_ArraySearch($Rep1, "Server Report", 0, 0, 0, 1)
		If @error Then
			$p += 1
			GUICtrlSetData($IperfT2, $p)
			GUICtrlSetBkColor($IperfT2, 0xFF0000)
		EndIf
		;обнуление массива $Rep1
		For $d = 0 To 19
			$Rep1[$d] = ""
		Next
		;_ArrayDisplay($Rep1, "After Deletion")
	EndIf
	FileFlush($sFileX1)
	FileClose($sFileX1)
	$Ser = GUICtrlRead($SerialN)
	FileMove($sFileX1, "C:\tester\logs\iperf\log1" & '-' & @YEAR & '-' & @MON & '-' & @MDAY & '-' & @HOUR & '-' & @MIN & '-' & @SEC & '-' & $Ser & ".txt")
	FileFlush($sFileX1)
EndFunc   ;==>_IPERFLog1
Функция CopySbLog:
Код:
Func _CopySbLog()
	;after all loop copy file Sb.txt to Sb_logs directory with name + "Data+Time" + Serial
	$PathSbLog = "c:\tester\Sb_Win10\Sb.txt"
	$PathToCopyLogs = "c:\tester\logs\Sb_Logs\"
	$PathCSV = "c:\tester\logs\CSV\CSV.txt"
	$Ser = GUICtrlRead($SerialN)
	FileCopy($PathSbLog, $PathToCopyLogs & "Sb-" & @YEAR & '-' & @MON & '-' & @MDAY & '-' & @HOUR & '-' & @MIN & '-' & @SEC & '-' & $Ser & ".txt")
	Sleep(1000)
	;insert Sb.txt to multi array
	#Region add to array
	$i = 1 ; lines of file. start from line 2
	$z = 0 ;line of array
	$j = -1 ;row of array
	Dim $aParsing[100][8]
	Global $hFile = FileOpen($PathSbLog)
	If $hFile = -1 Then
		MsgBox(4096, "Error", "Not found file:" & $PathSbLog)
		Exit
	EndIf
	$TestTime = FileReadLine($hFile, 1)
	$TT = StringSplit($TestTime, ','' ')
	Global $TT2 = $TT[4]
	Global $TT3 = $TT[6]
	While 1
		$i += 1
		$sTemp = FileReadLine($hFile, $i)
		If @error = -1 Then ExitLoop
		$z += 1
		If StringInStr($sTemp, "ric#") Then
			$j += 1
			$z = 0
		EndIf
		$aParsing[$z][$j] = $sTemp
	WEnd
	FileFlush($PathSbLog)
	FileClose($PathSbLog)
	Sleep(1000)
	#EndRegion add to array
	#Region parsing
	Global $Mas[0], $AllMas[50][8]
	$r = 0
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 1
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 2
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 3
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 4
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 5
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 6
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	$r = 7
	Local $aNumbers = StringSplit($aParsing[0][$r], ', ''.''=')
	$Mas = $aNumbers
	For $i = 0 To $Mas[0] - 1
		$AllMas[$i][$r] = $Mas[$i + 1]
	Next
	Local $aNumbers = StringSplit($aParsing[1][$r], ' = ''°')
	$Mas2 = $aNumbers
	For $i = 0 To $Mas2[0] - 1
		$AllMas[$i + 7][$r] = $Mas2[$i + 1]
	Next
	#EndRegion parsing

	;insert data to GUI.
	For $i = 0 To 3
		GUICtrlSetData($array[0][$i + 1], $AllMas[18][$i])
		GUICtrlSetData($array[1][$i + 1], $AllMas[2][$i])
		GUICtrlSetData($array[2][$i + 1], $AllMas[6][$i])
		GUICtrlSetData($array[3][$i + 1], $AllMas[11][$i])
	Next

	;insert data to CSV
	Local $hCSV = FileOpen($PathCSV, 1)

	; check file is open/possible to edit
	If $hCSV = -1 Then
		MsgBox(4096, "Error", "Not found file:" & $PathCSV)
		Exit
	EndIf

	; write to CSV.
	FileWrite($hCSV, $TT2 & "," & $TT3 & "," & $AllMas[2][0] & "," & $AllMas[6][0] & "," & $AllMas[11][0] & "," & $AllMas[18][0] & "," & _
			$AllMas[2][1] & "," & $AllMas[6][1] & "," & $AllMas[11][1] & "," & $AllMas[18][1] & "," & _
			$AllMas[2][2] & "," & $AllMas[6][2] & "," & $AllMas[11][2] & "," & $AllMas[18][2] & "," & _
			$AllMas[2][3] & "," & $AllMas[6][3] & "," & $AllMas[11][3] & "," & $AllMas[18][3] & "," & _
			$AllMas[2][4] & "," & $AllMas[6][4] & "," & $AllMas[11][4] & "," & $AllMas[18][4] & "," & _
			$AllMas[2][5] & "," & $AllMas[6][5] & "," & $AllMas[11][5] & "," & $AllMas[18][5] & "," & _
			$AllMas[2][6] & "," & $AllMas[6][6] & "," & $AllMas[11][6] & "," & $AllMas[18][6] & "," & _
			$AllMas[2][7] & "," & $AllMas[6][7] & "," & $AllMas[11][7] & "," & $AllMas[18][7] & "," & @CRLF)
	Sleep(1000)
	FileFlush($PathCSV)
	FileClose($PathCSV)
EndFunc   ;==>_CopySbLog

Буду рад помощи в поиске причины сбоя.
Спасибо.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
FileOpen($sFileX5, 1)
FileWrite($sFileX5, $Out9 & @CRLF)
FileFlush($sFileX5)
FileClose($sFileX5)

это неправильное использование функций, открытый FileOpen файл не закрыть так изучай справку.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
sngr
Спасибо за столь быстрый и полезный ответ, действительно ошибка. И как раз том самом подозрительном месте!
Как бы я хотел, чтобы это и была единственная причина крушения скрипта!
Так как проверка занимает продолжиительное время, я подожду денёк со следующим запуском,
и приглашаю высказать своё мнение также других участников форума.
Спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Эта ошибка в нескольких местах кода. В итоге, код увидели и нашли ошибку. Заочное обсуждение еще б на страницу затянули :smile:
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
FileClose($PathCSV)
FileClose($PathSbLog)

та же ошибка
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Скрипт работает уже более 65 часов :smile: и счётчик циклов превысил 32767 ;)
Это победа ! :IL_AutoIt_1:
Спасибо всем, кто принимал участие в обсуждении и поиске проблемы.
 
Верх