Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Форма в потоке или поток в форме  [new]
Basketbol
Member

Откуда:
Сообщений: 20
Добрый день, Уважаемое Сообщество Профессионалов!
Начал писать приложение с использованием Chromium и моего любимого Cef4Delphi)

Задача: в главном потоке главной формы создать MDI окна с браузерами и в них параллельно выполнять JS скрипты, читать выводы из консоли, выполнять различные последовательности действий. Т.е. кликнуть, подождать появление такого то элемента на странице и т.д. И это все должно делаться параллельно асинхронно в нескольких дочерних окнах, в каждом из которых есть экземпляр браузера.
В каждом экземпляре нужно периодически выполнять JS скрипты, которые выводят в консоль браузера необходимую инфу, я ловлю эти данные в onConsoleMessage, записываю это все в поле формы и главный поток мог бы пробегаться по всем формам, и собирать все данные в одну кучу.

Дело в том что сейчас у меня это все работает, но только каждый браузер в отдельном приложении. Соответственно все в одном потоке, и никаких заморочек с параллельностью не возникает.

Я решил все сделать о феншую, и объединить все в одном приложении.

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

Наведите на путь истинный: от какой первоначальной схемы начинать копать?

Вариант 1: Создаем необходимое количество потоков, и в каждом потоке создаем форму, ссылку на дочернюю форму записываем в поле главной формы, начинаем выполнять JS скрипты в браузере, ловить сообщения из консоли и записывать их в поле дочерней формы (хозяйки браузера).

Вариант 2: Создаем форму, в событии onShow создаем браузер (это дело тоже асинхронное), дожидаемся создания браузера, запускаем поток который постоянно опрашивает главный поток на тему что сейчас ему делать.

Вариант 3: Я - лошара, ничего не понимаю в потокох, несу полную ахинею, и моя задача решается вот так [тут_свой_вариант].

Thanks in advance!
6 июл 19, 14:27    [21922020]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
ziv-2014
Member

Откуда:
Сообщений: 342
Basketbol,
сам Chromium создает 3 процесса и несколько потоков. Ну как бы все для людей.
Внутри chromium есть очередь событий - она исполняется в отдельном потоке.
Рендеринг происходит в основном потоке, потому что он синхронзируется с основной формой.
Скорее всего ты можешь создать несколько js скриптов, которые будут исполняться ассинхронно и выдавать результат. Можно обойтись одним браузером.
Тебе больше подойдет вариант 2.
Или запускаешь браузер, создаешь нужные js скрипты, которые исполняются ассинхронно. Запускаешь html с этими скриптами, далее перехватываешь результат и синхронизируешь с главной формой.
6 июл 19, 15:34    [21922032]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
Basketbol
Member

Откуда:
Сообщений: 20
ziv-2014, спасибо за ответ.
Мне нужна параллельная автоматизированная работа на разных сайтах.
Т.е. в одном из хромиумов открыта страница сайта site1.
На ней выполняется не только сбор информации, но и всякие программы: кликнуть, подождать реакции, перейти, подождать загрузки и т.д.. Вот эти все "подождать реакции", "подождать загрузки" подождать еще чего то - это все ожидание заполнения полей формы в true. Плюс какие то вычисления в самом потоке. Т.е. совместная работа и браузера и потока. Грубо говоря - если из консоли пришло сообщение Mess1 то ты делаем в потоке то то... и т.д.
И вот таких параллельных работ должно быть не колько. А главный поток должен собирать инфу со всех форм и отвечать на запросы дочерних потоков.
Как то так
6 июл 19, 16:26    [21922045]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
ziv-2014
Member

Откуда:
Сообщений: 342
Basketbol, У тебя есть в js есть ассинхронные запросы, которые выполняются в отдельном потоке! Делай получение данных на них, а далее данные скидывай и обрабатывай в основном потоке. Есть же возможность часть функций js перекрыть и вызывать код из делфи. Есть примеры в CEF4. Зачем только к консоли привязываться.
6 июл 19, 16:31    [21922048]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
Basketbol
Member

Откуда:
Сообщений: 20
Я понял мысль. Но все равно не получается.
Например - я нажимаю "залогиниться в таком то сайте".
Открывается форма и начинает выполняться эта задача.
Не дожидаясь выполнения первой задачи, я запускаю логин еще на трех сайтах в других трех окнах.
Согласно твоей логике - в главном окне в момент запуска приложения должен запускаться какой то вечный цикл, который бы анализировал есть ли сейчас выполняющиеся задачи, если есть - проходить по ним в цикле, контролировать каждый шаг этих задач, запускать соответствующие скрипты, поднимать-опускать флаги ожидания.. и когда где то возникает исключение - отваливаются все задачи, а не только та, где возникает исключение.
Вечный цикл - это что то типа
  while 2 > 1 do
  begin
     processTasks;
     sleep(10);
     Application.proccesMessages;
  end


Эта конструкция будет явно нагружать комп.

На мой взгляд - более гибкое решение - для каждой задачи создавать отдельный поток, который бы обменивался данными в обе стороны с главным потоком. Передавал инфу об исключительных ситуациях. Выполнялся бы в своем ритме, независимо от соседних потоков.
7 июл 19, 09:03    [21922162]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
Basketbol
Member

Откуда:
Сообщений: 20
Пришел к выводу, что тема топика изначально звучит не правильно.
Форму в потоке создавать - не правильно, ибо изначально все VCL однопоточно и должно выполняться в главном потоке.
Поток в форме - наверное можно, но проще просто для каждой формы - браузера создавать поток, и записывать его в массив потоков.
А на событие закрытия формы уничтожать и сам поток.
7 июл 19, 10:23    [21922170]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1343
Basketbol,

Формы в потоке создавать можно, но на WinApi и все придется делать ручками. Это не очень сложно, не знаю правда про Cef4Delphi, как он реализован.

Вариант попроще - все таки запускать формы отдельными процессами, которыми можно управлять по stdin\stdout, тогда можно использовать VCL
7 июл 19, 11:56    [21922195]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
ziv-2014
Member

Откуда:
Сообщений: 342
Basketbol
Я понял мысль. Но все равно не получается.
Например - я нажимаю "залогиниться в таком то сайте".
Открывается форма и начинает выполняться эта задача.
Не дожидаясь выполнения первой задачи, я запускаю логин еще на трех сайтах в других трех окнах.
Согласно твоей логике - в главном окне в момент запуска приложения должен запускаться какой то вечный цикл, который бы анализировал есть ли сейчас выполняющиеся задачи, если есть - проходить по ним в цикле, контролировать каждый шаг этих задач, запускать соответствующие скрипты, поднимать-опускать флаги ожидания.. и когда где то возникает исключение - отваливаются все задачи, а не только та, где возникает исключение.
Вечный цикл - это что то типа
  while 2 > 1 do
  begin
     processTasks;
     sleep(10);
     Application.proccesMessages;
  end


Эта конструкция будет явно нагружать комп.

На мой взгляд - более гибкое решение - для каждой задачи создавать отдельный поток, который бы обменивался данными в обе стороны с главным потоком. Передавал инфу об исключительных ситуациях. Выполнялся бы в своем ритме, независимо от соседних потоков.


Вы меня не поняли. Уточняю, вам всю работу с сайтами надо перенести в js. Или на другой вариант - создаете нужное кол-во окон браузера в основном потоке и запускаете нужные ссылки. Chromium изначально грузить данные в потоке - о чем я писал выше.
7 июл 19, 15:35    [21922249]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
Василий 2
Member

Откуда:
Сообщений: 607
Имхо, пытаясь впихнуть невпихуемое (несколько многопроцессных хромиумов в один свой процесс) - задача гиблая. Наверняка что-нибудь да вылезет потом. Посему логичней повторить архитектуру самого браузера и плодить процессы, управляя ими уже любым способом на свой вкус.
10 июл 19, 17:43    [21924343]     Ответить | Цитировать Сообщить модератору
 Re: Форма в потоке или поток в форме  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
Basketbol
Я решил все сделать о феншую, и объединить все в одном приложении.
Зачем?
10 июл 19, 19:51    [21924409]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить