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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2017, 13:56   #1
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию Потоки и процедуры вызываемые из потока

добрый день подскажите, есть поток

Код:
procedure TMyThread.Execute;
begin
xxxxxxxxxxxxx
xxxxxxxxxxxxx
end;
если из него вызывается функция\выполняется процедура, она будет выполнена в этом же потоке или в основном ?
Если в основном, то как ее выполнить в созданом потоке ?( В TMyThread)
remus-xe2 вне форума Ответить с цитированием
Старый 27.10.2017, 14:04   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
в этом же потоке
В нём же.
А если нужно из основного, то для этого используем Synchronize.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.10.2017, 14:19   #3
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
В нём же.
А если нужно из основного, то для этого используем Synchronize.
Спасибо, но если вся эта цепочка процедур\функций выполняется в том же потоке в котором и была вызвана как правильно обращаться к VCL компонентам ?

Пример
Код:
procedure LogError;
begin
   form1.edit1.text:='Error';
end;

procedure Scan;
begin
...
   LogError;
...
end;

procedure TMyThread.Execute;
begin
     Scan;
end;





Процедуру через Synchronize(LogError) вызвать не получается из Scan...
Или обращаться к визуальным компонентам (изменять их значения) лучше только из procedure TMyThread.Execute; ?

Последний раз редактировалось remus-xe2; 27.10.2017 в 14:32.
remus-xe2 вне форума Ответить с цитированием
Старый 27.10.2017, 15:03   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
Спасибо, но если вся эта цепочка процедур\функций выполняется в том же потоке в котором и была вызвана как правильно обращаться к VCL компонентам ?
VCL не является поток-безопасными. Поэтому для доступа к ним нужно использовать синхронизацию.

Если надо вернуть данные. То самый простой способ таймер на форму и глобальный массив результатов. Потоки складывают результаты в массив каждый в свою ячейку. А таймер периодически читает результаты и выводит.

Так же можно использовать мьютексы и критические секции. К примеру при обновлении прогресс-бара защёлкиваем мьютекс изменяем значение прогресса и открываем мьютекс. Мьютекс должен быть общий для всех потоков.

Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
Процедуру через Synchronize(LogError) вызвать не получается из Scan...
Это ещё почему? TThread.Synchronize(LogError)
Метод Synchronize объявлен как "class procedure" это означает что она может вызываться без создания объекта.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработайте программу работы с односвязным списком. Программа должна содержать следующие процедуры, вызываемые из меню Nika1997 Общие вопросы Delphi 12 08.03.2015 22:46
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Потоки: неверный дескриптор(6) при создании потока [MoNAMur] Общие вопросы Delphi 4 08.11.2011 12:05
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50