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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2017, 18:42   #1
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
По умолчанию Потоки

Помогите понять потоки, в частности не могу понять одного, есть процедура
Код:
procedure TMyThread.Execute;
 begin 
procedure Pr1;
end;
если в эту процедуру вставить код, и запустить поток , например с кнопки
Код:
 MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;
То поток запускает procedure Pr1 , но у меня есть еще одна процедура с вычислениями "procedure Pr2 " , и мне ее надо тоже в потоке, но не паралельно, а отдельно. То куда мне "procedure Pr2 " надо вставить.
Извините что обьяснить толком не могу, но как смог, может поймете.
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума Ответить с цитированием
Старый 11.01.2017, 19:36   #2
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Михаил Юрьевич Посмотреть сообщение
Помогите понять потоки, в частности не могу понять одного, есть процедура
Код:
procedure TMyThread.Execute;
 begin 
procedure Pr1;
end;
если в эту процедуру вставить код, и запустить поток , например с кнопки
Код:
 MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;
То поток запускает procedure Pr1 , но у меня есть еще одна процедура с вычислениями "procedure Pr2 " , и мне ее надо тоже в потоке, но не паралельно, а отдельно. То куда мне "procedure Pr2 " надо вставить.
Извините что обьяснить толком не могу, но как смог, может поймете.
а второй поток создать?
и когда именно надо запускать вторую процедуру? после каких действий?
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 11.01.2017, 19:37   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Отдельно это как по какому событию она должна запускаться? До pr1 после pr1 одновременно или произвольно по нажатию второй кнопке?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.01.2017, 19:41   #4
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Отдельно это как по какому событию она должна запускаться? До pr1 после pr1 одновременно или произвольно по нажатию второй кнопке?
автор пока не решил) как решит тогда скажет) а пока проверяем свои "экстрасенсорные способности"
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 11.01.2017, 19:48   #5
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
По умолчанию

Есть две процедуры с вычислениями: procedure Pr1 , procedure Pr2
При нажатии на button1 , вычисляется procedure Pr1 и останавливается или уничтожается, а при нажатии на button2 вычисляется procedure Pr2 и так же останавливается и уничтожается, я понять не могу, куда например вставить procedure Pr2 , если допустим procedure Pr1 я вставляю в
Код:
procedure TMyThread.Execute;
 begin 
procedure Pr1;
end;
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума Ответить с цитированием
Старый 11.01.2017, 20:13   #6
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Раз уж нет необходимости выполнять процедуры параллельно то вставляйте ее туда же, таким вот образом:

Код:
var
  FlagProc1, FlagProc2: Boolean;


procedure TForm2.FormCreate(Sender: TObject);
begin
  FlagProc1:=false;
  FlagProc2:=false;
end;

procedure Proc1;
begin
  ...
  FlagProc1:=false;
end;

procedure Proc2;
begin
  ...
  FlagProc2:=false;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  FlagProc1:=true;
  MyThread:=TMyThread.Create(True);
  MyThread.FreeOnTerminate:=true;
  MyThread.Priority:=tpNormal;
  MyThread.Resume;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  FlagProc2:=true;
  MyThread:=TMyThread.Create(True);
  MyThread.FreeOnTerminate:=true;
  MyThread.Priority:=tpNormal;
  MyThread.Resume;
end;

procedure TMyThread.Execute;
begin
  if FlagProc1 then Proc1;
  if FlagProc2 then Proc2;
end;
И, во избежание казусов, я бы добавил блокировку кнопок (запускающих поток), на время выполнения потока.

Последний раз редактировалось Replicant; 11.01.2017 в 20:17.
Replicant вне форума Ответить с цитированием
Старый 11.01.2017, 20:19   #7
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
if FlagProc1 then Proc1;
if FlagProc2 then Proc2;
До этого и я додумался, думал что это не правильно,
Скажите заодно ,если паралельно два потока не будет выполняться, то нужно синхронизировать с progressbar потоки?

И еще: в процедуре в конце вычислений разрушаю поток так:
Код:
TerminateThread(GetCurrentThread,0); //уничтожить поток
Надо это делать или нет, или он сам разрушиться после выполнения?
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума Ответить с цитированием
Старый 11.01.2017, 20:32   #8
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Если, во время выполнения потока, к прогрессбару (любому другому объекту GUI) не обращается ни один объект/метод, то не вижу смысла выполнять синхронизацию.
Далее, у вас будет прописано:
Код:
MyThread.FreeOnTerminate:=true;
Это означает, что поток сам себя уничтожит по завершению работы, дополнительно его уничтожать ненужно!
Replicant вне форума Ответить с цитированием
Старый 11.01.2017, 20:35   #9
Михаил Юрьевич
Форумчанин
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 655
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
MyThread:=TMyThread.Create(True);
Я смотрю у вас true стоит, а не false должно быть в моем случае?
Он не сразу должен запускаться?
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума Ответить с цитированием
Старый 11.01.2017, 20:42   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Если, во время выполнения потока, к прогрессбару (любому другому объекту GUI) не обращается ни один объект/метод, то не вижу смысла выполнять синхронизацию.
Мышкой просто по окну двигаешь - там множество сообщений ему приходит, окно можно передвигать, оно может пересовываться. Так что рано или поздно завалится, обычно в самый не подходящий момент, при демонстрации заказчику например ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
Потоки. pinkiller Общие вопросы C/C++ 8 11.01.2012 21:15
потоки пауэрлифтинг Общие вопросы Delphi 5 23.05.2010 14:19
Потоки StudeHt Помощь студентам 1 06.05.2010 16:26