Amigo86 80 #271553 Posted May 19, 2015 Amigo86, ты ли это? Кто посмел меня вспомнить тута?))) 1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #271555 Posted May 19, 2015 А если бы я написал "Тётя", то кто ZoranFeran что ли? Если бабушка была бы дедушкой, то... Кто посмел меня вспомнить тута?))) Дядя, кто-же еще... Quote Share this post Link to post Short link Share on other sites
Amigo86 80 #271559 Posted May 19, 2015 1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #271560 Posted May 19, 2015 Дядя, ты файлы там сам смотрел? файлы customization.xml у ВГ не запакованы. Потому и пишет Орион что не распаковал ибо нечего распаковывать. в беспотоковом режиме файл скипался) Quote Share this post Link to post Short link Share on other sites
o-0-0-0 77 #271582 Posted May 19, 2015 Ребят подскажите как сделать простейшую программку вопрос - ответ ? import sys f = open('programma1.xml', 'r')line = f.readlines()_name = raw_input(line[0])if _name == line: print ('Yes')else: print ('No!') в файлике xml вопросы и ответы , ребёнок мне все нервы вымотает сейчас ))) Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #271599 Posted May 20, 2015 (edited) Ребят подскажите как сделать простейшую программку вопрос - ответ ? import sys f = open('programma1.xml', 'r') line = f.readlines() _name = raw_input(line[0]) if _name == line: print ('Yes') else: print ('No!') в файлике xml вопросы и ответы , ребёнок мне все нервы вымотает сейчас ))) зачем вам readines? Прочитайте про minidom. Edited May 20, 2015 by ShadowHunterRUS 1 Quote Share this post Link to post Short link Share on other sites
伝説の 15 #271610 Posted May 20, 2015 Не кто не знает, в ангаре GUI.Text работает? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #271611 Posted May 20, 2015 Не кто не знает, в ангаре GUI.Text работает? Работает. Quote Share this post Link to post Short link Share on other sites
伝説の 15 #271615 Posted May 20, 2015 Работает.А откуда инфа если не секрет? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #271617 Posted May 20, 2015 А откуда инфа если не секрет? Странные вопрос. Сбил-сколотил, сел-поехал. Значит работает. Quote Share this post Link to post Short link Share on other sites
伝説の 15 #271619 Posted May 20, 2015 Странные вопрос. Сбил-сколотил, сел-поехал. Значит работает.Почему странный? я думал он только в бою текст отображает! но вот чтоб в ангаре... вот и спросил, про пруф. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #271620 Posted May 20, 2015 Почему странный? я думал он только в бою текст отображает! но вот чтоб в ангаре... вот и спросил, про пруф. ГУИ - это графический интерфейс. Когда он есть, а он есть и в ангаре и в бою, то мона его юзать. Пруфа не будет - это личный опыт. Да и нет пруфов по написанию модов. Quote Share this post Link to post Short link Share on other sites
伝説の 15 #271621 Posted May 20, 2015 ГУИ - это графический интерфейс. Когда он есть, а он есть и в ангаре и в бою, то мона его юзать. Пруфа не будет - это личный опыт. Да и нет пруфов по написанию модов. Да это то понятно, просто большая часть текста в игре отображается через флеш, а использование GUI.Text видел только в модах. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #271622 Posted May 20, 2015 (edited) Да это то понятно, просто большая часть текста в игре отображается через флеш, а использование GUI.Text видел только в модах. Красивости нет. _name = raw_input(line[0]) Ого, теперь я понял зачем нужен input. Не доводилось пользоваться. , короче вот до чего докурился. В описании к одному из примеров написано: -------------------------------------------------------------- 22) Using Threading, Windows Console and Command line arguments (Kylix ready) -------------------------------------------------------------- When doing multithreading, be sure that the calling thread finishes after all created threads, otherwise your application will hang ! This is easily done by using the threading module of the standard Python distribution, and calling the "join" method of the thread objects. If you want to display messages in your threads, you can't use the PythonForDelphi redirection to a memo, as the VCL is not thread safe ! So, a simple way is to use the new TPythonEngine.UseWindowsConsole property which will use a Windows threadsafe console. In this demo, we use the sys.argv list which contains the command line arguments. Note for Python 1.5.2: if you're using the threading module, you should do a TPythonEngine.Finalize in the OnClose event of your form, otherwise you'll get an access violation ! I don't know why ? Because it works fine with new 1.6 version ! Затем я поглядел эту виндовую консоль, если её подрубить путем: procedure TPythonEngine.InitWinConsole; begin {$IFDEF MSWINDOWS} FreeConsole; AllocConsole; SetConsoleTitle( 'Python console' ); {$ENDIF} end; а затем вырубить перенаправление std-вызовов в самопальный модуль ввода/вывода "pyio", то проблема ввода данных из потока исчезает. Виртуальная машина спокойно откладывает туда инфу и консоль её отображает (Вообще не плохая штука. Думаю добавлю возможность её врубить/вырубить) Что касается самопального ввода/вывода. То он реализован так: 1. В пасике объявлены методы // Module pyio for Python Input/Outputs function pyio_write(self, args : PPyObject) : PPyObject; cdecl; function pyio_read(self, args : PPyObject) : PPyObject; cdecl; ... 2. Затем на стороне пасика создается модуль ввода/вывода // create a new module called pyio FIOPythonModule := TPythonModule.Create( Self ); with FIOPythonModule as TPythonModule do begin Engine := Self; ModuleName := 'pyio'; AddMethod( 'write', pyio_write, 'write(String) -> None' ); AddMethod( 'read', pyio_read, 'read() -> String' ); AddMethod( 'SetDelayWrites', pyio_SetDelayWrites, 'SetDelayWrites(Boolean) -> None' ); AddMethod( 'SetMaxLines', pyio_SetMaxLines, 'SetMaxLines(Integer) -> None' ); AddMethod( 'GetTypesStats', pyio_GetTypesStats, 'GetTypesStats( [type name] ) -> a list of tuple (TypeName, InstanceCount, CreateHits, DeleteHits)' ); end; 3. И заглатывается питоном with FIOPythonModule as TPythonModule do if not Initialized then Initialize; 4. После чего на стороне питона хукается ввода/вывод, примерно так: 'import sys'+LF+ 'class DebugOutput:'+LF+ ' pyio = __import__("pyio")'+LF+ ' softspace=0'+LF+ ' encoding=None'+LF+ ' def write(self,message):'+LF+ ' self.pyio.write(message)'+LF+ ' def readline(self, size=None):'+LF+ ' return self.pyio.read(size)'+LF+ ' def flush(self):' + LF + ' pass' + LF + 'sys.old_stdin=sys.stdin'+LF+ 'sys.old_stdout=sys.stdout'+LF+ 'sys.old_stderr=sys.stderr'+LF+ 'sys.stdin=sys.stderr=sys.stdout=DebugOutput()'+LF+#0; 5. Ну и наконец что из себя представляет метод на стороне пасика function pyio_write(self, args : PPyObject) : PPyObject; var a1 : PPyObject; //Msg: TMsg; begin // Forbid printing for any other thread than the main one {$IFNDEF FPC} if GetCurrentThreadId <> MainThreadId then with GetPythonEngine do begin if RedirectIO and (IO <> nil) and (IO.ClassName <> 'TPythonInputOutput') then begin Result := GetPythonEngine.ReturnNone; Exit; end; end; {$ENDIF} with GetPythonEngine do begin if Assigned(args) and (PyTuple_Size(args) > 0) then begin a1 := PyTuple_GetItem(args, 0); if RedirectIO and (IO <> nil) and Assigned(a1) then begin if PyUnicode_Check(a1) then IO.Write(PyUnicode_AsWideString(a1)) else if PyString_Check(a1) then IO.Write(PyObjectAsString(a1)); end; Result := ReturnNone; end else begin PyErr_BadArgument; Result := nil; end; end; // while ProcessMessage(Msg) do {loop}; //### StranikS_Scan теперь инфа обновляется в циклах end; Edited May 20, 2015 by StranikS_Scan 1 Quote Share this post Link to post Short link Share on other sites
伝説の 15 #271637 Posted May 20, 2015 Не кто не знает, в ангаре GUI.Text работает? Работает. =) Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #271648 Posted May 20, 2015 (edited) , короче вот до чего докурился. Я, вообще-то, не особо заинтересован в питоне, но + Edited May 20, 2015 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #271654 Posted May 20, 2015 (edited) Result := GetPythonEngine.ReturnNone; Exit; Вынес запись в IO в отдельную классовую процедуру. Затем вместо этого, вписал вызов потока TThread с синхронным вызовом классовой процедуры внутри. И ни фига не помогает. Поток при синхронизации уходит в буфер синхронизации. Однако главный поток метод в буфере не обрабатывает и или не может сделать этого, хз. Даже вешал CheckSynchronize() в главном, так он проигнорил метод в буфере синхронизации. Что за косяк такой ((((( Edited May 20, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #271660 Posted May 20, 2015 (edited) Вынес запись в IO в отдельную классовую процедуру. Затем вместо этого, вписал вызов потока TThread с синхронным вызовом классовой процедуры внутри. И ни фига не помогает. Поток при синхронизации уходит в буфер синхронизации. Однако главный поток метод в буфере не обрабатывает и или не может сделать этого, хз. Даже вешал CheckSynchronize() в главном, так он проигнорил метод в буфере синхронизации. Что за косяк такой (((((А через Windows console все нормально работает?Можно ведь держать это окно открытым и перенаправлять потоки вывода в Memo, тот еще костыль... Edited May 20, 2015 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #271665 Posted May 20, 2015 Можно ведь держать это окно открытым и перенаправлять потоки вывода в Memo, тот еще костыль...А чем не вариант безоконный запуск питона с перехватом потоков ввода/вывода/ошибок? Помню как-то делал так, правда на C#. Ведь по сути получится то же самое? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #271674 Posted May 20, 2015 (edited) Немного локализовал проблему. Дедлок самый обычный получается - при вызове PyExec в пасике из главного потока, главный поток оказывается в ожидании когда отработает питон или когда он вернет управление главному потоку. А питон в свою очередь создает дочерний поток из которого вызывает метод pyio_write. Метод конечно срабатывает, однако по отношению к главному потоку пасика вызов этого метода происходит из параллельного потока. В этом методе мы скидываем буфер в TSynEdit. И вроде бы всё должно быть ОК. Но есть загвозда при обращении к TSynEdit мы должны либо делать синхронизацию, либо блокировку, либо обращаться через посылку системных сообщений. И вот тут весь косяк и происходит. Сообщения отсылаются, а главный-то поток заморожен и ждет возврата управления. Как результат дочерний поток встает в дедлок и дальше зависон. Вот хороший вопрос как это разрулить без танцев с бубном (((( Edited May 20, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites