Jump to content
Korean Random
StranikS_Scan

PjOrion - редактирование, компиляция, декомпиляция, обфускация модов (Версия: 1.3.5 Дата: 11.08.2019)

Пользуетесь ли вы Орионом?  

314 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

А если бы я написал "Тётя", то кто ZoranFeran что ли?  :heh:

Если бабушка была бы дедушкой, то...

Кто посмел меня вспомнить тута?))) :gg:

Дядя, кто-же еще...

Share this post


Link to post

Short link
Share on other sites

Дядя, ты файлы там сам смотрел? файлы  customization.xml у ВГ не запакованы. Потому и пишет Орион что не распаковал ибо нечего распаковывать.

в беспотоковом режиме файл скипался)

Share this post


Link to post

Short link
Share on other sites

Ребят подскажите как сделать простейшую программку вопрос - ответ ?

import sys

 

f = open('programma1.xml', 'r')
line = f.readlines()
_name = raw_input(line[0])
if _name == line:
    print ('Yes')
else:
    print ('No!')

 

в файлике xml вопросы и ответы , ребёнок мне все нервы вымотает сейчас ))) 

Share this post


Link to post

Short link
Share on other sites

Ребят подскажите как сделать простейшую программку вопрос - ответ ?

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 by ShadowHunterRUS
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

А откуда инфа если не секрет?

 

Странные вопрос. Сбил-сколотил, сел-поехал. Значит работает.

Share this post


Link to post

Short link
Share on other sites

Странные вопрос. Сбил-сколотил, сел-поехал. Значит работает.

Почему странный? я думал он только в бою текст отображает! но вот чтоб в ангаре... вот и спросил, про пруф.

Share this post


Link to post

Short link
Share on other sites

Почему странный? я думал он только в бою текст отображает! но вот чтоб в ангаре... вот и спросил, про пруф.

 

ГУИ - это графический интерфейс. Когда он есть, а он есть и в ангаре и в бою, то мона его юзать. Пруфа не будет - это личный опыт. Да и нет пруфов по написанию модов.

Share this post


Link to post

Short link
Share on other sites

ГУИ - это графический интерфейс. Когда он есть, а он есть и в ангаре и в бою, то мона его юзать. Пруфа не будет - это личный опыт. Да и нет пруфов по написанию модов.

Да это то понятно, просто большая часть текста в игре отображается через флеш, а использование GUI.Text видел только в модах.

Share this post


Link to post

Short link
Share on other sites

Да это то понятно, просто большая часть текста в игре отображается через флеш, а использование GUI.Text видел только в модах.

 

Красивости нет.

 

_name = raw_input(line[0])

 

Ого, теперь я понял зачем нужен input. Не доводилось пользоваться.  :heh:

 


 

, короче вот до чего докурился. В описании к одному из примеров написано:

 

--------------------------------------------------------------

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 by StranikS_Scan
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

, короче вот до чего докурился.

 

Я, вообще-то, не особо заинтересован в питоне, но + Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites
            Result := GetPythonEngine.ReturnNone;

           Exit;

 

Вынес запись в IO в отдельную классовую процедуру. Затем вместо этого, вписал вызов потока TThread с синхронным вызовом классовой процедуры внутри. И ни фига не помогает. Поток при синхронизации уходит в буфер синхронизации. Однако главный поток метод в буфере не обрабатывает и или не может сделать этого, хз. Даже вешал CheckSynchronize() в главном, так он проигнорил метод в буфере синхронизации. Что за косяк такой (((((

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Вынес запись в IO в отдельную классовую процедуру. Затем вместо этого, вписал вызов потока TThread с синхронным вызовом классовой процедуры внутри. И ни фига не помогает. Поток при синхронизации уходит в буфер синхронизации. Однако главный поток метод в буфере не обрабатывает и или не может сделать этого, хз. Даже вешал CheckSynchronize() в главном, так он проигнорил метод в буфере синхронизации. Что за косяк такой (((((

А через Windows console все нормально работает?

Можно ведь держать это окно открытым и перенаправлять потоки вывода в Memo, тот еще костыль...

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Можно ведь держать это окно открытым и перенаправлять потоки вывода в Memo, тот еще костыль...

А чем не вариант безоконный запуск питона с перехватом потоков ввода/вывода/ошибок? Помню как-то делал так, правда на C#. Ведь по сути получится то же самое?

Share this post


Link to post

Short link
Share on other sites

Немного локализовал проблему. Дедлок самый обычный получается - при вызове PyExec в пасике из главного потока, главный поток оказывается в ожидании когда отработает питон или когда он вернет управление главному потоку. А питон в свою очередь создает дочерний поток из которого вызывает метод pyio_write. Метод конечно срабатывает, однако по отношению к главному потоку пасика вызов этого метода происходит из параллельного потока. В этом методе мы скидываем буфер в TSynEdit. И вроде бы всё должно быть ОК. Но есть загвозда при обращении к TSynEdit мы должны либо делать синхронизацию, либо блокировку, либо обращаться через посылку системных сообщений. И вот тут весь косяк и происходит. Сообщения отсылаются, а главный-то поток заморожен и ждет возврата управления. Как результат дочерний поток встает в дедлок и дальше зависон.

 

Вот хороший вопрос как это разрулить без танцев с бубном ((((

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...