Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Помогите понять потоки, в частности не могу понять одного, есть процедура
Код:

procedure TMyThread.Execute;
 begin 
procedure Pr1;
end;

если в эту процедуру вставить код, и запустить поток , например с кнопки
Код:

 MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;

То поток запускает procedure Pr1 , но у меня есть еще одна процедура с вычислениями "procedure Pr2 " , и мне ее надо тоже в потоке, но не паралельно, а отдельно. То куда мне "procedure Pr2 " надо вставить.
Извините что обьяснить толком не могу, но как смог, может поймете.
__________________
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума   Ответить с цитированием
Старый 11.01.2017, 20:36   #2
Fahman
Участник клуба
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 690
Репутация: 23
По умолчанию

Цитата:
Сообщение от Михаил Юрьевич Посмотреть сообщение
Помогите понять потоки, в частности не могу понять одного, есть процедура
Код:

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, 20:37   #3
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,110
Репутация: 1199
По умолчанию

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

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

Есть две процедуры с вычислениями: procedure Pr1 , procedure Pr2
При нажатии на button1 , вычисляется procedure Pr1 и останавливается или уничтожается, а при нажатии на button2 вычисляется procedure Pr2 и так же останавливается и уничтожается, я понять не могу, куда например вставить procedure Pr2 , если допустим procedure Pr1 я вставляю в
Код:

procedure TMyThread.Execute;
 begin 
procedure Pr1;
end;

__________________
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума   Ответить с цитированием
Старый 11.01.2017, 21:13   #6
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
Репутация: 74
По умолчанию

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

Код:

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 в 21:17.
Replicant вне форума   Ответить с цитированием
Старый 11.01.2017, 21:19   #7
Михаил Юрьевич
Участник клуба
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 633
Репутация: 33
По умолчанию

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

И еще: в процедуре в конце вычислений разрушаю поток так:
Код:

TerminateThread(GetCurrentThread,0); //уничтожить поток

Надо это делать или нет, или он сам разрушиться после выполнения?
__________________
За частые поиски был забанен во всех известных
поисковых системах!
Михаил Юрьевич вне форума   Ответить с цитированием
Старый 11.01.2017, 21:32   #8
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
Репутация: 74
По умолчанию

Если, во время выполнения потока, к прогрессбару (любому другому объекту GUI) не обращается ни один объект/метод, то не вижу смысла выполнять синхронизацию.
Далее, у вас будет прописано:
Код:

MyThread.FreeOnTerminate:=true;

Это означает, что поток сам себя уничтожит по завершению работы, дополнительно его уничтожать ненужно!
Replicant вне форума   Ответить с цитированием
Старый 11.01.2017, 21:35   #9
Михаил Юрьевич
Участник клуба
 
Аватар для Михаил Юрьевич
 
Регистрация: 25.12.2007
Сообщений: 633
Репутация: 33
По умолчанию

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




02:36.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru