Re:
Хорошо. Я включил на тест. Сразу сказать не получиться, нужно подождать, что-бы больше примеров набралось - совпадений (особенно в конце файла). Оставлю на ночь и завтра обязательно напишу.
Добавлено:
Здравствуйте,
причина обнауржена. Скрипт просто не успевает, файл обновляется быстрее чем читается скриптом.
Я долго наблюдал и заметил
1) Что некоторые снижения цен он просто не показывает. Потом увидел, что почти все изменения цен находятся либо чуть ниже середины файла, дальше он просто не успевает - файл обновляется.
2) Чужая программа уже выслала мне все совпадения, а скрипт ещё только через 10 минут написал "файл прочитан"
3) В файле 11500 строк. Я добавил ToolTip на строки, что бы быть полностью уверенным и увидел, что скрипт доходит примерно до 7 тыс строк, а потом файл (1.тхт) обновляется. Сравнил скорость записи чужой программы, примерно 40 строк в секунду, скрипт около 9-11.
На сколько я знаю параллельные процессы в Autoit не возможны. Моё предложение по оптимизации топорное - 3 скрипта, один скрипт читает каждую вторую строку, другой каждую 3 строки итд. Так должен скрипт успевать вроде. Если есть более элегантное решение, то буду очень рад.
Я только сейчас УВИДЕЛ ВАШ НОВЫЙ СКРИПТ КОТОРЫЙ ВЫ ДОБАВИЛИ 23:15:50 (самый последний), ЕГО Я НЕ ТЕСТИРОВАЛ.
Сейчас буду тестировать его.
Протестировал самый последний скрипт к сожалению тоже самое.
Скрипт 1700 строк прочитал, а за это время было записанно 11500 строк и файл обновился.
Ещё заметил помимо медленного прочтения, скрипт может "призадуматься" - подвиснуть секунд на 10 а иногда даже на минуту, а потом просто идти дальше.
В последний раз скрипт просто завис минут на 6, потом продолжил.
Alofa сказал(а):Dk протестируйте ка на скорость пока это:
Не вижу смысла заниматься остальными доработками, пока не устраним главный затык.Код:#include <Array.au3> #include <WindowsConstants.au3> #include <ListViewConstants.au3> #include <GUIConstantsEx.au3> Opt('GUIOnEventMode', 1) Opt('TrayOnEventMode', 1) Opt('TrayMenuMode', 3) Local $vVar, $asText1, $asText2, $sFile2GTime, $iOffset, $sFile1 = @ScriptDir & '\1.txt', $sFile2 = @ScriptDir & '\2.txt' Local $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit _OpenFile2() $hGUI = GUICreate('Список:', 600, 175, -1, -1) GUISetBkColor(0xB9D1EA) $ListView = GUICtrlCreateListView('ASIN-10 |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 590, 125, -1, BitOR($LVS_EX_FULLROWSELECT,$LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP)) $hButt1 = GUICtrlCreateButton('Очистить список', 100, 140, 150, 25) $hButt2 = GUICtrlCreateButton('Выйти из программы', 350, 140, 150, 25) $hGUIState = TrayCreateItem('Отобразить/Скрыть Окно') TrayCreateItem('') $hExit = TrayCreateItem('Выход') GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked') GUICtrlSetOnEvent($hButt1, '_ListViewClear') GUICtrlSetOnEvent($hButt2, '_Exit') TrayItemSetOnEvent($hGUIState, '_CLOSEClicked') TrayItemSetOnEvent($hExit, '_Exit') GUISetState(@SW_HIDE) While 1 If FileGetTime($sFile2, 0, 1) <> $sFile2GTime Then _OpenFile2() $asText1 = _FileRead($sFile1) If @error Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "1.txt".') $iExtended = @extended $asText1 = StringRegExp($asText1, '\n"(\w{10,12})"\t(?:[^\t]+\t){2}([\d\,N/A]+)\t(?:[^\t]+\t){5}([\d\,N/A]+)', 3, $iOffset) For $i = 0 To UBound($asText1) - 3 Step 3 $iIndex = _ArraySearch($asText2, $asText1[$i], 0, 0, 0, 1) If @error Then ContinueLoop $asText2Split = StringSplit($asText2[$iIndex], '|') If @error Then ExitLoop $vVar = ($asText1[$i + 2] = 'N/A') ? -1 : $asText1[$i + 2] If $asText2Split[2] <> 'N/A' Or $asText1[$i + 1] <> 'N/A' Then If StringReplace($asText2Split[2], ',', '.') / StringReplace($asText1[$i + 1], ',', '.') >= 2 And StringReplace($vVar, ',', '.') < 300000 Then GUICtrlCreateListViewItem($asText1[$i] & '|' & $asText1[$i + 1] & '|' & $asText2Split[2] & '|' & _ $asText1[$i + 2] & '|' & $asText2Split[3] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN, $ListView) GUISetState(@SW_SHOWNORMAL) SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') EndIf EndIf _ArrayDelete($asText2, $iIndex) Next $iOffset = ($iExtended >= 3) ? $iExtended - 2 : 1 Sleep(250) WEnd ;====================================================================================================================== Func _OpenFile2() Dim $asText2 $iOffset = 1 $asText2 = _FileRead($sFile2) If @error Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "2.txt".') FileWrite($sFile2, @CRLF & '>>>> Data is read. Time: ' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ' <<<<') $sFile2GTime = FileGetTime($sFile2, 0, 1) $asText2 = StringRegExpReplace($asText2, '\n"(\w{10,12})"\t"([^\t]+)"\t[^\t]+\t([\d\,N/A]+).+', '${1}|${3}|${2}|') $asText2 = StringRegExp($asText2, '\v(.+)\|', 3) If @error Then Exit MsgBox(16, 'Ошибка!', 'Не удалось корректно прочитать "2.txt".') EndFunc ;==>_OpenFile2 Func _FileRead($sFile) For $i = 0 To 20 $sChars = FileRead($sFile) If $sChars Then Return $sChars Sleep(90) Next Return SetError(1) EndFunc ;==>_FileRead Func _CLOSEClicked() GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL) EndFunc ;==>_CLOSEClicked Func _ListViewClear() GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0) EndFunc ;==>_ListViewClear Func _Exit() Exit EndFunc ;==>_Exit
Хорошо. Я включил на тест. Сразу сказать не получиться, нужно подождать, что-бы больше примеров набралось - совпадений (особенно в конце файла). Оставлю на ночь и завтра обязательно напишу.
Добавлено:
Сообщение автоматически объединено:
Alofa сказал(а):Dk протестируйте ка на скорость пока это:
Не вижу смысла заниматься остальными доработками, пока не устраним главный затык.Код:#include <Array.au3> #include <WindowsConstants.au3> #include <ListViewConstants.au3> #include <GUIConstantsEx.au3> Opt('GUIOnEventMode', 1) Opt('TrayOnEventMode', 1) Opt('TrayMenuMode', 3) Local $vVar, $asText1, $asText2, $sFile2GTime, $iOffset, $sFile1 = @ScriptDir & '\1.txt', $sFile2 = @ScriptDir & '\2.txt' Local $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit _OpenFile2() $hGUI = GUICreate('Список:', 600, 175, -1, -1) GUISetBkColor(0xB9D1EA) $ListView = GUICtrlCreateListView('ASIN-10 |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 590, 125, -1, BitOR($LVS_EX_FULLROWSELECT,$LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP)) $hButt1 = GUICtrlCreateButton('Очистить список', 100, 140, 150, 25) $hButt2 = GUICtrlCreateButton('Выйти из программы', 350, 140, 150, 25) $hGUIState = TrayCreateItem('Отобразить/Скрыть Окно') TrayCreateItem('') $hExit = TrayCreateItem('Выход') GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked') GUICtrlSetOnEvent($hButt1, '_ListViewClear') GUICtrlSetOnEvent($hButt2, '_Exit') TrayItemSetOnEvent($hGUIState, '_CLOSEClicked') TrayItemSetOnEvent($hExit, '_Exit') GUISetState(@SW_HIDE) While 1 If FileGetTime($sFile2, 0, 1) <> $sFile2GTime Then _OpenFile2() $asText1 = _FileRead($sFile1) If @error Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "1.txt".') $iExtended = @extended $asText1 = StringRegExp($asText1, '\n"(\w{10,12})"\t(?:[^\t]+\t){2}([\d\,N/A]+)\t(?:[^\t]+\t){5}([\d\,N/A]+)', 3, $iOffset) For $i = 0 To UBound($asText1) - 3 Step 3 $iIndex = _ArraySearch($asText2, $asText1[$i], 0, 0, 0, 1) If @error Then ContinueLoop $asText2Split = StringSplit($asText2[$iIndex], '|') If @error Then ExitLoop $vVar = ($asText1[$i + 2] = 'N/A') ? -1 : $asText1[$i + 2] If $asText2Split[2] <> 'N/A' Or $asText1[$i + 1] <> 'N/A' Then If StringReplace($asText2Split[2], ',', '.') / StringReplace($asText1[$i + 1], ',', '.') >= 2 And StringReplace($vVar, ',', '.') < 300000 Then GUICtrlCreateListViewItem($asText1[$i] & '|' & $asText1[$i + 1] & '|' & $asText2Split[2] & '|' & _ $asText1[$i + 2] & '|' & $asText2Split[3] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN, $ListView) GUISetState(@SW_SHOWNORMAL) SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') EndIf EndIf _ArrayDelete($asText2, $iIndex) Next $iOffset = ($iExtended >= 3) ? $iExtended - 2 : 1 Sleep(250) WEnd ;====================================================================================================================== Func _OpenFile2() Dim $asText2 $iOffset = 1 $asText2 = _FileRead($sFile2) If @error Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "2.txt".') FileWrite($sFile2, @CRLF & '>>>> Data is read. Time: ' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ' <<<<') $sFile2GTime = FileGetTime($sFile2, 0, 1) $asText2 = StringRegExpReplace($asText2, '\n"(\w{10,12})"\t"([^\t]+)"\t[^\t]+\t([\d\,N/A]+).+', '${1}|${3}|${2}|') $asText2 = StringRegExp($asText2, '\v(.+)\|', 3) If @error Then Exit MsgBox(16, 'Ошибка!', 'Не удалось корректно прочитать "2.txt".') EndFunc ;==>_OpenFile2 Func _FileRead($sFile) For $i = 0 To 20 $sChars = FileRead($sFile) If $sChars Then Return $sChars Sleep(90) Next Return SetError(1) EndFunc ;==>_FileRead Func _CLOSEClicked() GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL) EndFunc ;==>_CLOSEClicked Func _ListViewClear() GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0) EndFunc ;==>_ListViewClear Func _Exit() Exit EndFunc ;==>_Exit
Здравствуйте,
причина обнауржена. Скрипт просто не успевает, файл обновляется быстрее чем читается скриптом.
Я долго наблюдал и заметил
1) Что некоторые снижения цен он просто не показывает. Потом увидел, что почти все изменения цен находятся либо чуть ниже середины файла, дальше он просто не успевает - файл обновляется.
2) Чужая программа уже выслала мне все совпадения, а скрипт ещё только через 10 минут написал "файл прочитан"
3) В файле 11500 строк. Я добавил ToolTip на строки, что бы быть полностью уверенным и увидел, что скрипт доходит примерно до 7 тыс строк, а потом файл (1.тхт) обновляется. Сравнил скорость записи чужой программы, примерно 40 строк в секунду, скрипт около 9-11.
На сколько я знаю параллельные процессы в Autoit не возможны. Моё предложение по оптимизации топорное - 3 скрипта, один скрипт читает каждую вторую строку, другой каждую 3 строки итд. Так должен скрипт успевать вроде. Если есть более элегантное решение, то буду очень рад.
Я только сейчас УВИДЕЛ ВАШ НОВЫЙ СКРИПТ КОТОРЫЙ ВЫ ДОБАВИЛИ 23:15:50 (самый последний), ЕГО Я НЕ ТЕСТИРОВАЛ.
Сейчас буду тестировать его.
Протестировал самый последний скрипт к сожалению тоже самое.
Скрипт 1700 строк прочитал, а за это время было записанно 11500 строк и файл обновился.
Ещё заметил помимо медленного прочтения, скрипт может "призадуматься" - подвиснуть секунд на 10 а иногда даже на минуту, а потом просто идти дальше.
В последний раз скрипт просто завис минут на 6, потом продолжил.