Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поток не помогает справится с зависанием формы / 7 сообщений из 7, страница 1 из 1
16.12.2020, 18:55
    #40028420
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
Здравствуйте.
Имеются компоненты питона для Delphi
Сделал нарыл в гугле скриншот страницы по URL. Всё работает. Но на время выполнения кода, программа подвисает. Решил сделать это всё в потоке, что бы главная форма не фризилась.
Но поток как выяснилось не момогает..
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
  { =======POTOK========= }
type
  POTOK = class(TThread)
  private

  public
    { Private declarations }
  protected
    procedure Execute; override;
    procedure SYNC;
  end;

  { =======POTOK========= }
var
  Form2: TForm2;
  Ptk: POTOK;

implementation

{$R *.dfm}

procedure TForm2.sSpeedButton1Click(Sender: TObject);
begin
  sMemo1.Clear;
  sMemo1.Lines.Add('import asyncio');
  sMemo1.Lines.Add('import pyppeteer  # $ pip install pyppeteer');
  sMemo1.Lines.Add('');
  sMemo1.Lines.Add('async def main():');
  sMemo1.Lines.Add('    browser = await pyppeteer.launch()');
  sMemo1.Lines.Add('    page = await browser.newPage()');
  sMemo1.Lines.Add('    await page.goto(''' + sEdit1.Text + ''')');
  sMemo1.Lines.Add('    await page.setViewport(dict(width=1024, height=768))');
  sMemo1.Lines.Add('    await page.screenshot(path=''' + sEdit2.Text + ''', fullPage=False)');
  sMemo1.Lines.Add('    await browser.close()');
  sMemo1.Lines.Add('');
  sMemo1.Lines.Add('asyncio.get_event_loop().run_until_complete(main())');

  { POTOK }
  Ptk := POTOK.Create(True);
  Ptk.FreeOnTerminate := True;
  Ptk.Priority := tpNormal;
  Ptk.Resume;
end;

{ POTOK }
procedure POTOK.Execute;
begin
  inherited;
  Synchronize(SYNC);
end;

procedure POTOK.SYNC;
begin

  Form2.PythonEngine1.ExecStrings(Form2.sMemo1.Lines);

end;



Как видно я обращаюсь к мемо на форме..
Но я так же пробовал объявить переменную StringList, в приват\паблик секции потока, и перед запуском потока я передавал в стринглист весь текст из мемо.
Но всё ровно форма подвисает на время выполнения кода.
Скажите пожалуйста, что я делаю не так?
...
Рейтинг: 0 / 0
16.12.2020, 19:26
    #40028442
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
Tech N9neСкажите пожалуйста, что я делаю не так?

Ты всю работу выполняешь в главном потоке. Прочитай уже справку по Synchronize().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.12.2020, 21:06
    #40028485
Tech N9ne
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
Dimitry Sibiryakov

Tech N9neСкажите пожалуйста, что я делаю не так?

Ты всю работу выполняешь в главном потоке. Прочитай уже справку по Synchronize().

Вроде понял, Synchronize() и тормозит форму..

Пробую делать без Synchronize().
в потоке создаю StringList, завожу нужные строки в него, создаю PY := TPythonEngine.Create(nil);,
и потом PY.ExecStrings(TS);

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
  { =======POTOK========= }
type
  POTOK = class(TThread)
  private
    TS: TStringList;
    PY: TPythonEngine;
  public

    { Private declarations }
  protected
    procedure Execute; override;

  end;


var
  Form2: TForm2;
  Ptk: POTOK;  { =======POTOK========= }

implementation

{$R *.dfm}

procedure TForm2.sSpeedButton1Click(Sender: TObject);
begin
  Ptk := POTOK.Create(True);
  Ptk.FreeOnTerminate := True;
  Ptk.Priority := tpNormal;
  Ptk.Resume;
end;

{ POTOK }
procedure POTOK.Execute;

begin
  inherited;
  TS := TStringList.Create;
  PY := TPythonEngine.Create(nil);
  try
    TS.Clear;
    TS.Add('import asyncio');
    TS.Add('import pyppeteer  # $ pip install pyppeteer');
    TS.Add('');
    TS.Add('async def main():');
    TS.Add('    browser = await pyppeteer.launch()');
    TS.Add('    page = await browser.newPage()');
    TS.Add('    await page.goto(''' + 'https://google.ru' + ''')');
    TS.Add('    await page.setViewport(dict(width=1024, height=768))');
    TS.Add('    await page.screenshot(path=''' + 'c:/qbove.jpg' + ''', fullPage=False)');
    TS.Add('    await browser.close()');
    TS.Add('');
    TS.Add('asyncio.get_event_loop().run_until_complete(main())');
    PY.ExecStrings(TS);
  finally
    FreeAndNil(TS);
    FreeAndNil(PY);
  end;
end;


Но так не работает.
Будет рабоать, только если не создавать в потоке TPythonEngine, а в потоке сослаться на компонент на форме "TPythonEngine", но опять же форма будет фризить..
Я так понял, не правильно создаю TPythonEngine...?
...
Рейтинг: 0 / 0
16.12.2020, 21:30
    #40028499
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
Tech N9ne
Я так понял, не правильно создаю TPythonEngine...?
Может ему нужна оконная процедура? Что по этому поводу говорит документация/исходники?
...
Рейтинг: 0 / 0
16.12.2020, 23:51
    #40028550
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
Tech N9ne,

TPyDelphiThread вроде для этого там должен быть
...
Рейтинг: 0 / 0
17.12.2020, 09:26
    #40028597
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
Tech N9ne,

Вы сейчас пытаетесь починить двигатель V8 не имея представления о том, как работает ДВС в принципе.

Надо разбить код на два этапа: вычисления и вывод. Первый этап можно засунуть в поток, второй - нельзя. Точнее второй должен быть в Synchronize. У вас же они объединены в один и его нельзя использовать внутри потока.
...
Рейтинг: 0 / 0
17.12.2020, 11:47
    #40028649
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поток не помогает справится с зависанием формы
alekcvp
Tech N9ne,

Вы сейчас пытаетесь починить двигатель V8 не имея представления о том, как работает ДВС в принципе.

Долго чесал репу, при чем здесь хромовский JS движок... :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поток не помогает справится с зависанием формы / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]