powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поток не помогает справится с зависанием формы
7 сообщений из 7, страница 1 из 1
Поток не помогает справится с зависанием формы
    #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
Поток не помогает справится с зависанием формы
    #40028442
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9neСкажите пожалуйста, что я делаю не так?

Ты всю работу выполняешь в главном потоке. Прочитай уже справку по Synchronize().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поток не помогает справится с зависанием формы
    #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
Поток не помогает справится с зависанием формы
    #40028499
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne
Я так понял, не правильно создаю TPythonEngine...?
Может ему нужна оконная процедура? Что по этому поводу говорит документация/исходники?
...
Рейтинг: 0 / 0
Поток не помогает справится с зависанием формы
    #40028550
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tech N9ne,

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

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

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

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

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


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