Что нового

Скрипт не успевает прочесть строку в логфайле

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
я на самом деле ошибся, что свело на нет весь смысл моего поста :smile: файл нужно заранее открыть, иначе опять же чтение будет происходить снова и снова
Код:
$sFile = 'C:\prog.log'
$hFile = FileOpen($sFile, 0)
While 1
    $sRead = FileRead($hFile)
    ; В $sRead находится все содержимое файла на момент открытия
    ; При всех последующих чтениях в переменной будет только то содержимое, которое появилось с момента последнего чтения
    Sleep(1000)
WEnd
 
Автор
A

at

Гость
Kaster: файл нужно заранее открыть...
Нет никакой реакции ни на новые строки, ни на старые.


Добавлено:
Сообщение автоматически объединено:

Yashied, попытался сделать по Вашему примеру. Не получилось. Пожалуйста, подскажите в моем скрипте ошибки.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm = GUICreate('PROGA', 152, 65, 225, 150)
$vInput_1 = GUICtrlCreateInput('', 32, 8, 105, 21)
$vLabel_Info = GUICtrlCreateLabel(' ... жду сигнал', 32, 40, 84, 17)
$vCheckbox1 = GUICtrlCreateCheckbox('', 8, 9, 17, 15)
GUISetState(@SW_SHOW)

Global $vScript_Name, $sFile, $sRead, $Buff = ''

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		EndSwitch
		 If GUICtrlRead($vCheckbox1) = $GUI_CHECKED Then
			$vScript_Name = GUICtrlRead($vInput_1)
		 EndIf
		
            $sRead = FileRead('C:\prog.log')
			$sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
			$sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')

         If Not @error Then
        $Text = StringTrimLeft($sRead, StringLen($Buff))
        $Buff = $sRead
             If $Text Then
			
				 If $sString_Buy Then
					 Buy()
				 ElseIf $sString_Sale Then
					 Sale()
				 EndIf
				 
			 EndIf
		EndIf	 
WEnd

Func Buy()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("БОЛИД", 32, 40, 84, 17)
EndFunc

Func Sale()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("ФЕРАРРИ", 32, 40, 84, 17)
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
at [?]
Нет никакой реакции ни на новые строки, ни на старые.
что за реакция? я к тому, что нет надобности читать файл каждый раз и обрабатывать все содержимое. FileRead каждый раз читает считывает с последней позиции до конца файла. как только файл меняется, позиция конца файла смещается, и поэтому FileRead считает именно изменение. ты можешь брать на вооружение любой скрипт, я лишь к тому, что надо передавать для FileRead дескриптор открытого файла, а не путь до файла.
 
Автор
A

at

Гость
Kaster, делаю так:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm = GUICreate('PROGA', 152, 65, 225, 150)
$vInput_1 = GUICtrlCreateInput('', 32, 8, 105, 21)
$vLabel_Info = GUICtrlCreateLabel(' ... жду сигнал', 32, 40, 84, 17)
$vCheckbox1 = GUICtrlCreateCheckbox('', 8, 9, 17, 15)
GUISetState(@SW_SHOW)

Global $vScript_Name, $sFile = 'C:\prog.log', $hFile = FileOpen($sFile, 0), $sRead

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		EndSwitch
		 If GUICtrlRead($vCheckbox1) = $GUI_CHECKED Then
			$vScript_Name = GUICtrlRead($vInput_1)
		 EndIf
		
            $sRead = FileRead($hFile)
			$sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
			$sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')
			
				 If $sString_Buy Then
					 Buy()
				 ElseIf $sString_Sale Then
					 Sale()
				 EndIf
        Sleep(1000)
WEnd

Func Buy()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("БОЛИД", 32, 40, 84, 17)
EndFunc

Func Sale()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("ФЕРАРРИ", 32, 40, 84, 17)
EndFunc

Условие не выполняется и скрипт вообще никак не реагирует на изменение в логфайле. Подскажите, что не так...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Во, во. Я наступил на те же грабли, когда попытался в цикле смешать GUIGetMsg и какие-то свои операции. Обрати внимание - все предложенные тебе варианты не содержат GUIGetMsg в теле основного цикла. Я понимаю что хочется чтобы было красиво, но это потом... А сейчас главное решить проблему с чтением файла. Поэтому вопрос: простой код который не обрабатывает события, а лишь читает файл и ищет нужную строку - он работает?
Вот типа такой
Код:
Global $vScript_Name="...", $sFile = 'C:\prog.log', $hFile = FileOpen($sFile, 0), $sRead

While 1
            $sRead = FileRead($hFile)
            $sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
            $sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')
           
                 If $sString_Buy Then
                     Buy()
                 ElseIf $sString_Sale Then
                     Sale()
                 EndIf
        Sleep(1000)
WEnd
 
Автор
A

at

Гость
C2H5OH, спасибо за помощь.
Делал так:
Код:
Global $vScript_Name="FT", $sFile = 'C:\prog.log', $hFile = FileOpen($sFile, 0), $sRead

While 1
            $sRead = FileRead($hFile)
            $sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
            $sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')
           
                 If $sString_Buy Then
                     Buy()
                 ElseIf $sString_Sale Then
                     Sale()
                 EndIf
WEnd

Func Buy()
		Sleep(10)
		MsgBox(0, "БОЛИД", "", 1)
EndFunc

Func Sale()
		Sleep(10)
		MsgBox(0, "ФЕРАРРИ", "", 1)
EndFunc
К сожалению и Ваш вариант в рабочем режиме не отрабатывает условие. Пробовал с паузой, не помогает.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Стоп, стоп, стоп!
1. Это не совсем мой скрипт, это скрипт Yashied. Его особенность в том что он читает ВСЁ от текущей позиции и до конца файла, то есть многострочный текст. (я предлагал читать файл построчно, но это замедлило бы работу скрипта)

Если Вы хотите использовать эту идею (скрипт Yashied), то Вам необходимо учитывать что $sRead содержит не одну строку, а несколько.
1.1 В этом, кстати, кроется ещё одна проблема, если вдруг Вы решите запустить скрипт на уже готовый файл размером более 2147483647.

2. Такая схема прекрасно работает. Попробуйте сами.

Генератор файла
Код:
$file = FileOpen("test_file.txt", 1)
While 1
	FileWriteLine($file, Chr(Random(97,122,1)) & Chr(Random(48,57,1)) )
	Sleep(100)
WEnd
FileClose($file)


И сам тестовый скрипт
Код:
$hFile = FileOpen("test_file.txt", 0)

While 1
	$sRead = FileRead($hFile)
	If StringInStr($sRead, "a") Then MsgBox(0, "нашел", $sRead, 1)
	Sleep(200)
WEnd


Генерируется файл вида Буква + Цифра
И в нём идёт поиск того что содержит символ "а".
Как видите результат не сама строка с "а", а всё что прочиталось в $sRead
Но все "а" прекрасно находятся.
 
Автор
A

at

Гость
C2H5OH, спасибо огромное за помощь. Ваш последний вариант, к сожалению не работает. Но зато работает Ваш предыдущий вариант, я сам допустил неточность при первоначальном тестировании.
Вобщем так работает:
Код:
Global $vScript_Name="FT", $sFile = 'C:\prog.log', $hFile = FileOpen($sFile, 0), $sRead

While 1
            $sRead = FileRead($hFile)
            $sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
            $sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')
           
                 If $sString_Buy Then
                     Buy()
                 ElseIf $sString_Sale Then
                     Sale()
                 EndIf
WEnd

Func Buy()
        Sleep(10)
        MsgBox(0, "БОЛИД", "", 1)
EndFunc

Func Sale()
        Sleep(10)
        MsgBox(0, "ФЕРАРРИ", "", 1)
EndFunc

А вот так работает с GUI:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm = GUICreate('PROGA', 152, 65, 225, 150)
$vInput_1 = GUICtrlCreateInput('', 21, 8, 110, 21)
$vLabel_Info = GUICtrlCreateLabel(' ... жду сигнал', 32, 40, 84, 17)
GUISetState(@SW_SHOW)

Global $vScript_Name, $sFile = 'C:\prog.log', $hFile = FileOpen($sFile, 0), $sRead

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		EndSwitch

			$vScript_Name = GUICtrlRead($vInput_1)
            $sRead = FileRead($hFile)
			$sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
			$sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')
			
				 If $sString_Buy Then
					 Buy()
				 ElseIf $sString_Sale Then
					 Sale()
				 EndIf
        Sleep(10)
WEnd

Func Buy()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("БОЛИД", 32, 40, 84, 17)
EndFunc

Func Sale()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("ФЕРАРРИ", 32, 40, 84, 17)
EndFunc

Думаю, что тема решена. Спасибо всем большое за помощь.
 
Верх