![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
Здравствуйте.
Вот, например, я сделал программку для получения инфы про два принтера через веб-интерфейс. В одной процедуре я получаю очередь печати. Параметром в процедуру передаю IP принтера. Одна процедура у меня работает для двух принтеров. Чтоб это всё не зависало, пока идёт получение информации, решил получение очереди перенести в поток. Правильно ли я понимаю, что в потоках, в отличие от основного кода, информацию о двух принтерах я могу получать "параллельно"? Но тогда я уже не смогу обойтись одной процедурой - для каждого принтера придётся создавать свою, дублировать её в каждом потоке? Или как-то можно процедуру всё-таки оставить одну и вызывать её из двух потоков со своими параметрами? Или я могу создать два экземпляра одного потока и запускать со своими параметрами, и это будет нормально? И ещё недопонимаю про синхронизацию. Она нужна, если необходима строгая параллельность работы потока (потоков) и программы либо нескольких потоков? В моём случае она не нужна? И ещё, в процедуре/функции можно сделать необязательный параметр со значением по умолчанию, например Код:
Последний раз редактировалось Ship_1; 27.01.2017 в 10:13. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]() Цитата:
так же? смотря что вы имеете в виду под потоком. Если экземпляр класса наследника TThread, то просто в конструктор это можно добавить, ну и поле в классе. Код:
Результат работы потока тоже можно получать из public поля/свойства (заносить туда при получении инфы, читать в основном потоке после завершения), или событие/callback вызывать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 27.01.2017 в 10:35. |
|
![]() |
![]() |
![]() |
#3 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Локальные переменные и параметры у каждого потока свои. Код дублировать не надо.
Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
И? Это ж ее проблемы, а не клиента.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
Смотрю про потоки здесь. Как понял - синронизация забирает себе выполнение кода "засинхронизированной" процедуры до тех пор, пока она не выполнится? Или это только из-за "WaitFor", который необязателен?
В примере с синхронизацией уничтожение потоков происходит "вручную" и в теле execute потока. При этом переменные потока, судя по всему, глобальные. Мне глобальные не нужны. Можно ли их уничтожать в теле процедуры, из которой они записаны (типа bt1Click)? У меня в потоке будет выполняться три процедуры: 1. Получение текста с веб-страницы (допустим, Proc1) 2. Обработка результата (Proc2) 3. Вывод результата на форму (Proc3). Правильно ли я понимаю, что мне нужно Код:
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]() |
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Смотря как, но вообще нет.
Цитата:
Лучше это делать в самой форме после завершения, как выше написано.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 27.01.2017 в 11:10. |
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
У меня создалось впечатление, что если у потока есть свойства, которым надо присвоить значение, то нужно сначала создать экземпляр потока, потом присвоить ему значения параметров, а потом уже запустить "вручную". И подумал, почему-то, что и уничтожать, соответственно, в этом случае нужно тоже вручную.
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
A execute у процесса обязательно должна быть процедурой или может быть функцией? Если только процедурой, то как грамотно "вывести" StringList из потока? Пока у меня этот процесс был в функциях и процедурах, я создавал StringList в функции, присваивая переменной значение этой функции, а уничтожал в основном коде после обработки. А как быть с потоком? Работать в нём со StringList можно, сделав StringList его полем. Но после завершения потока ведь и его поля уничтожаются. Или как раз для этого и существует уничтожение вручную: сначала обработать результаты, а потом уничтожить из основного кода?
И можно ли делать автоуничтожение, если пользоваться >вот такой< "конструкцией"? В этом случае сначала срабатывает процедура не потока, но вызванная в потоке, а автоуничтожение срабатывает только после её завершения, не смотря на то, что процедура не из потока? |
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Даже если бы он был функцией, это не помогло бы.
Я ж выше писал как. Кстати, а почему Proc1 нужна синхронизация? Вот более полный пример с callback (рядом код валялся, не помню почему использовал колбэк вместо события, и не помню как в Дельфи создавать события). Код:
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 27.01.2017 в 12:06. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как можно заменять "запятая" на "Enter" | Silent-cry | Microsoft Office Word | 4 | 26.01.2018 12:03 |
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") | ZIRASS | PHP | 4 | 15.06.2016 14:23 |
Навеяно предыдущим топиком о Буфере обмена. Можно ли перехватить события "приКопированииВбуфер" и "приВставкеИзБуфера"? | DBEER | Microsoft Office Word | 9 | 06.03.2016 23:45 |
Как обойти "преобразование типа из "string" в "float" невозможно" | lexluter1988 | Помощь студентам | 1 | 07.08.2010 12:23 |