|
|
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Добрый день, Уважаемое Сообщество Профессионалов! Начал писать приложение с использованием Chromium и моего любимого Cef4Delphi) Задача: в главном потоке главной формы создать MDI окна с браузерами и в них параллельно выполнять JS скрипты, читать выводы из консоли, выполнять различные последовательности действий. Т.е. кликнуть, подождать появление такого то элемента на странице и т.д. И это все должно делаться параллельно асинхронно в нескольких дочерних окнах, в каждом из которых есть экземпляр браузера. В каждом экземпляре нужно периодически выполнять JS скрипты, которые выводят в консоль браузера необходимую инфу, я ловлю эти данные в onConsoleMessage, записываю это все в поле формы и главный поток мог бы пробегаться по всем формам, и собирать все данные в одну кучу. Дело в том что сейчас у меня это все работает, но только каждый браузер в отдельном приложении. Соответственно все в одном потоке, и никаких заморочек с параллельностью не возникает. Я решил все сделать о феншую, и объединить все в одном приложении. Когда что то нужно делать параллельно - без потоков не обойтись. Почитал различные темы на этом форуме, посмотрел код... Наведите на путь истинный: от какой первоначальной схемы начинать копать? Вариант 1: Создаем необходимое количество потоков, и в каждом потоке создаем форму, ссылку на дочернюю форму записываем в поле главной формы, начинаем выполнять JS скрипты в браузере, ловить сообщения из консоли и записывать их в поле дочерней формы (хозяйки браузера). Вариант 2: Создаем форму, в событии onShow создаем браузер (это дело тоже асинхронное), дожидаемся создания браузера, запускаем поток который постоянно опрашивает главный поток на тему что сейчас ему делать. Вариант 3: Я - лошара, ничего не понимаю в потокох, несу полную ахинею, и моя задача решается вот так [тут_свой_вариант]. Thanks in advance! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 14:27 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Basketbol, сам Chromium создает 3 процесса и несколько потоков. Ну как бы все для людей. Внутри chromium есть очередь событий - она исполняется в отдельном потоке. Рендеринг происходит в основном потоке, потому что он синхронзируется с основной формой. Скорее всего ты можешь создать несколько js скриптов, которые будут исполняться ассинхронно и выдавать результат. Можно обойтись одним браузером. Тебе больше подойдет вариант 2. Или запускаешь браузер, создаешь нужные js скрипты, которые исполняются ассинхронно. Запускаешь html с этими скриптами, далее перехватываешь результат и синхронизируешь с главной формой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 15:34 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
ziv-2014, спасибо за ответ. Мне нужна параллельная автоматизированная работа на разных сайтах. Т.е. в одном из хромиумов открыта страница сайта site1. На ней выполняется не только сбор информации, но и всякие программы: кликнуть, подождать реакции, перейти, подождать загрузки и т.д.. Вот эти все "подождать реакции", "подождать загрузки" подождать еще чего то - это все ожидание заполнения полей формы в true. Плюс какие то вычисления в самом потоке. Т.е. совместная работа и браузера и потока. Грубо говоря - если из консоли пришло сообщение Mess1 то ты делаем в потоке то то... и т.д. И вот таких параллельных работ должно быть не колько. А главный поток должен собирать инфу со всех форм и отвечать на запросы дочерних потоков. Как то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 16:26 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Basketbol, У тебя есть в js есть ассинхронные запросы, которые выполняются в отдельном потоке! Делай получение данных на них, а далее данные скидывай и обрабатывай в основном потоке. Есть же возможность часть функций js перекрыть и вызывать код из делфи. Есть примеры в CEF4. Зачем только к консоли привязываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 16:31 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Я понял мысль. Но все равно не получается. Например - я нажимаю "залогиниться в таком то сайте". Открывается форма и начинает выполняться эта задача. Не дожидаясь выполнения первой задачи, я запускаю логин еще на трех сайтах в других трех окнах. Согласно твоей логике - в главном окне в момент запуска приложения должен запускаться какой то вечный цикл, который бы анализировал есть ли сейчас выполняющиеся задачи, если есть - проходить по ним в цикле, контролировать каждый шаг этих задач, запускать соответствующие скрипты, поднимать-опускать флаги ожидания.. и когда где то возникает исключение - отваливаются все задачи, а не только та, где возникает исключение. Вечный цикл - это что то типа Код: pascal 1. 2. 3. 4. 5. 6. Эта конструкция будет явно нагружать комп. На мой взгляд - более гибкое решение - для каждой задачи создавать отдельный поток, который бы обменивался данными в обе стороны с главным потоком. Передавал инфу об исключительных ситуациях. Выполнялся бы в своем ритме, независимо от соседних потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2019, 09:03 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Пришел к выводу, что тема топика изначально звучит не правильно. Форму в потоке создавать - не правильно, ибо изначально все VCL однопоточно и должно выполняться в главном потоке. Поток в форме - наверное можно, но проще просто для каждой формы - браузера создавать поток, и записывать его в массив потоков. А на событие закрытия формы уничтожать и сам поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2019, 10:23 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Basketbol, Формы в потоке создавать можно, но на WinApi и все придется делать ручками. Это не очень сложно, не знаю правда про Cef4Delphi, как он реализован. Вариант попроще - все таки запускать формы отдельными процессами, которыми можно управлять по stdin\stdout, тогда можно использовать VCL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2019, 11:56 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
BasketbolЯ понял мысль. Но все равно не получается. Например - я нажимаю "залогиниться в таком то сайте". Открывается форма и начинает выполняться эта задача. Не дожидаясь выполнения первой задачи, я запускаю логин еще на трех сайтах в других трех окнах. Согласно твоей логике - в главном окне в момент запуска приложения должен запускаться какой то вечный цикл, который бы анализировал есть ли сейчас выполняющиеся задачи, если есть - проходить по ним в цикле, контролировать каждый шаг этих задач, запускать соответствующие скрипты, поднимать-опускать флаги ожидания.. и когда где то возникает исключение - отваливаются все задачи, а не только та, где возникает исключение. Вечный цикл - это что то типа Код: pascal 1. 2. 3. 4. 5. 6. Эта конструкция будет явно нагружать комп. На мой взгляд - более гибкое решение - для каждой задачи создавать отдельный поток, который бы обменивался данными в обе стороны с главным потоком. Передавал инфу об исключительных ситуациях. Выполнялся бы в своем ритме, независимо от соседних потоков. Вы меня не поняли. Уточняю, вам всю работу с сайтами надо перенести в js. Или на другой вариант - создаете нужное кол-во окон браузера в основном потоке и запускаете нужные ссылки. Chromium изначально грузить данные в потоке - о чем я писал выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2019, 15:35 |
|
||
|
Форма в потоке или поток в форме
|
|||
|---|---|---|---|
|
#18+
Имхо, пытаясь впихнуть невпихуемое (несколько многопроцессных хромиумов в один свой процесс) - задача гиблая. Наверняка что-нибудь да вылезет потом. Посему логичней повторить архитектуру самого браузера и плодить процессы, управляя ими уже любым способом на свой вкус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 17:43 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39834605&tid=2039277]: |
0ms |
get settings: |
7ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 378ms |

| 0 / 0 |
