Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2017, 12:12   #11
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
У меня создалось впечатление, что если у потока есть свойства, которым надо присвоить значение, то нужно сначала создать экземпляр потока, потом присвоить ему значения параметров, а потом уже запустить "вручную". И подумал, почему-то, что и уничтожать, соответственно, в этом случае нужно тоже вручную.
Вы про вывод результата забыли. Есть несколько путей.

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

Вариант второй поток перед тем как уничтожиться сбрасывает в глобальный объект свой результат.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 27.01.2017 в 12:33.
Pavia вне форума Ответить с цитированием
Старый 27.01.2017, 12:45   #12
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Поэтому самое просто кто породил потоки тот ждет пока они отработают,...
Это как? А программа что в это время делает? Висит? Если поток вызвался из основного кода.

Третий вариант
Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
OneMoreThread:=TOneMoreThread.Create;
OneMoreThread.OnTerminate:=MyThreadIsFinish; // когда будешь завершать свою работу, то  будем делать это
Ship_1 вне форума Ответить с цитированием
Старый 27.01.2017, 14:38   #13
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Это как? А программа что в это время делает? Висит? Если поток вызвался из основного кода.
Вы верно поняли что будет висеть. Что-бы не зависала в ожидание я его делал по по таймеру. Клал на форму обычный таймер и следил за готовностью потоков, как все отработали можно уничтожать. Можно ещё придумать варианты синхронизации на события, CallBack и сообщениях.

Как по мне OnTerminate бесполезное свойство - как собаке 5 нога. Вроде не мешает, а помогать не помогает
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.01.2017, 15:11   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Как по мне OnTerminate бесполезное свойство
это вариант для "терпеливых"
Цитата:
Клал на форму обычный таймер и следил за готовностью потоков
А здесь (OnTerminate) мы ни за чем не следим и ничего не делаем (или занимаемся своими делами: жмем разные кнопочки/набираем текст/.... чего зря форме простаивать если она может работать) и ждем до самого конца.
как отработали инициируем нашу MyTthreadFinish(это делает сам поток) и мы(уже форма) "скачиваем" ИЗ потока результаты (выводим).
(если у потока нет FreeOnTerminate то тут же можно заняться уничтожением).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.01.2017, 15:17   #15
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

"события, CallBack и сообщениях."... Что-то всё как-то уже слишком усложняется... Мне это не понятно на данном этапе развития.
evg_m, я попробовал, у меня Дельфи стал ругаться на несоответствие типов в присваивании процедур. А к нему можно присвоить процедуру с параметрами?
Ship_1 вне форума Ответить с цитированием
Старый 27.01.2017, 15:31   #16
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
я попробовал, у меня Дельфи стал ругаться на несоответствие типов в присваивании процедур
MyThreadIsFinish должен быть МЕТОДОМ какого либо объекта. обычно это форма из которой поток запускается.

Код:
Tform1 =class(Tform)
...
private
  procedure MyThreadIsFinish(sender: TObject);//вот так он должен быть объявлен
....
end;
если на форуме поискать OnTerminаte в Delphi разделе будем много разных ссылок( в т.ч. и мои посты).

Код:
procedure Tform1.MyThreadISFinish(sender: TObject);
begin
  (sender as TMyThread).... // а так можно будет достать данные ИЗ потока

end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.01.2017 в 15:34.
evg_m вне форума Ответить с цитированием
Старый 27.01.2017, 15:44   #17
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
"события, CallBack и сообщениях."... Что-то всё как-то уже слишком усложняется... Мне это не понятно на данном этапе развития.
Что сложного?
Вам надо сообщить форме, что поток завершился (и передать результат).
Самые простые варианты — сделать callback или событие вызываемое при завершении.

callback это просто: в форме есть функция, при запуске потока ему передается указатель на нее и при завершении он ее вызывает.
Я ж показал полный пример http://www.programmersforum.ru/showt...98#post1660776

Событие это примерно тоже самое, только мне лень вспоминать как они создаются в Дельфи.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 27.01.2017 в 15:51.
Alex11223 вне форума Ответить с цитированием
Старый 27.01.2017, 16:54   #18
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Alex11223, спасибо за пример
Кстати, забыл ответить: Proc1 нужна синхронизация исходя из предположения Pavia по поводу веба, но, исходя из Ваших слов, можно и убрать
По поводу того что сложного...
Например, непонятно, относится ли PrinterThreadCallback к обязательной или к необязательной части CallBack; с FCallbackProc, TCallbackProc и CallbackProc вообще путаница полная... FCallbackProc зачем, например?
Спасибо за дополнительное пояснение - чуть понятнее стало, но разобраться не помогло
Ship_1 вне форума Ответить с цитированием
Старый 27.01.2017, 17:50   #19
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
к обязательной или к необязательной части
части чего?
В моем примере все параметры потока (объекта) устанавливаются через его конструктор (Create).

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
FCallbackProc зачем, например?
Это указатель на процедуру. Надо ж его где-то хранить чтоб вызвать потом.

TCallbackProc просто описание процедуры (какие у нее параметры и т.п.).
Нельзя же передать что попало куда попало, Дельфи статически типизированный язык.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 27.01.2017 в 17:55.
Alex11223 вне форума Ответить с цитированием
Старый 28.01.2017, 16:04   #20
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот проект с Wininit, в этом проекте все делает unit UHTTPS написан в потоке с CallBack, В этом проекте есть многое что вас заинтересует, работа с потоком синхронность возврата вызовов, и запрос по WinInit c докачкой файла, код может работать в консольной программе в нем нет работы через объекты.
WinInit видел в одном из ваших постов кое что доделал

Более подробно в проекте
Вложения
Тип файла: rar test4.rar (180.1 Кб, 5 просмотров)

Последний раз редактировалось Aliens_wolfs; 28.01.2017 в 17:22.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно заменять "запятая" на "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