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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2011, 15:47   #11
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Несложно сообразить, что для этого нужно
Код:
Caption := 'Уря!'
заменить на запуск процесса.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.12.2011, 20:38   #12
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Туплю. Не знаю как задействовать ProgressBar на Form1 из юнита с потоком
Код:
procedure TDownloadThread.HTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  PostMessage(???, WM_USER, 1, AWorkCount);
end;

procedure TDownloadThread.HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  PostMessage(???, WM_USER, 0, AWorkCountMax);
end;

Последний раз редактировалось Shouldercannon; 21.12.2011 в 20:41.
Shouldercannon вне форума Ответить с цитированием
Старый 21.12.2011, 20:58   #13
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

??? - это информация, которая нужна потоку. Которой у потока нет. Что мы делаем с этой информацией?

Смотрим пример в коде. Пример такой информации - путь для сохранения и имя скачиваемого файла.

Внимание, вопрос: так что же тогда мы делаем с этой информацией?



































Блин, передаём её потоку, конечно же!

Как же это сделать?

























А ровно так же:

Код:
type
  TDownloadThread = class(TThread)
  private
    ...
    FProgressNotifyWnd: HWND;
    ...
  protected
    ...
    property ProgressNotifyWnd: HWND read FProgressNotifyWnd;
  public
    constructor Create(const AProgressNotifyWnd: HWND; ...);
    ...
  end;

constructor TDownloadThread.Create(const AProgressNotifyWnd: HWND; ...);
begin
  // Настройка потока:
  ...
  FProgressNotifyWnd := AProgressNotifyWnd;

  // Поехали! (С)
  inherited Create(False);
end;

procedure TDownloadThread.HTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  PostMessage(ProgressNotifyWnd, WM_USER, 1, AWorkCount);
end;

procedure TDownloadThread.HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  PostMessage(ProgressNotifyWnd, WM_USER, 0, AWorkCountMax);
end;
Ну ЧТО тут не понятно-то?

Тут не надо даже особо думать - просто тупо скопировать по шаблону уже написанный код. Только имя FileName заменить на ProgressNotifyWnd. Тип String на HWND. И всё.

P.S. Большие пробелы вставлены в пост в расчёте побудить желание подумать, прежде чем смотреть ответ.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.12.2011, 21:05   #14
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Тс, странный вы. И премеров вам дали, и толпы текса и кода вам тоже дали. А вы непонимаете.
Ну тут 2 вывода:
1. Вы хотите готовый код, под вас.
2. Вы не хотите понимать
3. Сами знаете.

Последний раз редактировалось Человек_Борща; 21.12.2011 в 21:08.
Человек_Борща вне форума Ответить с цитированием
Старый 21.12.2011, 21:25   #15
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Только имя FileName заменить на ProgressNotifyWnd. Тип String на HWND. И всё.
Тогда переменной FileName не будет и как я передам имя файла. Снова путаница или подвох, или я торможу?

Тяжело даётся освоение потоков. Только нашёл статью, где описывается работа с потоками и, вроде бы понял, но нет есть другой вид построения потока, который просто выносит.

Последний раз редактировалось Shouldercannon; 21.12.2011 в 21:41.
Shouldercannon вне форума Ответить с цитированием
Старый 21.12.2011, 21:40   #16
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Друг, в твоих вопросах потоками не пахнет. Речь идёт об основах работы с объектами.

Есть два пути:
1. Задача пока не для вас. Вернитесь к ней потом, после изучения основ.
2. Выбрать другой способ работы с потоками, без объектов. Например, BeginThread.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 04.10.2013, 21:59   #17
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Допустим ли такой способ завершения работы потока?
Код:
procedure TMyThread.Execute;
var
  i2: Integer;
begin
  for i2 := 0 to 60 do
  begin
    if i2 > 61 then Break;
    Sleep(100);
    i := i2;
    Synchronize(SyncProc);
  end;

  Terminate;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 04.10.2013, 22:15   #18
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

зачем? когда основная процедура потока (коей и является метод Execute) завершается - поток прекращается, а вот освобождается ли память, занятая под объект типа TThread - это другой вопрос, для этого либо FreeOnTerminate := true; либо самостоятельно вызвать деструктор
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 04.10.2013, 22:23   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Execute это и есть весь поток. Как только она кончится поток остановится!
и без использования Treminate;

Terminate; это процедура для ВОЗМОЖНОСТИ ВНЕШНЕЙ остановки потока.

это просто УСТАНОВКА флага.!
Код:
procedure TThread.Terminate;
begin
  terminated:=TRUE; 
end;
А чтобы воспользоваться внешней остановкой
НАДО внутри Execute проверять этот флаг(Terminated) и ПРИНИМАТЬ меры по завершению работы (выйти из процедуры/или цикла)
Код:
if treminated then EXIT;
Код:
myth.Terminate;
Код:
  for i2 := 0 to 60 do
  begin
    if terminated then break; 
    Sleep(100);
    i := i2;
    Synchronize(SyncProc);
  end;
http://programmersforum.ru/showthrea...ght=terminated
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.10.2013 в 22:28.
evg_m вне форума Ответить с цитированием
Старый 05.10.2013, 11:27   #20
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Хорошо. Тогда при таком раскладе
Код:
type
  TMyThread = class(TThread)
  private
    { Private declarations }
    i: Integer;
  protected
    procedure Execute; override;
    procedure DoTerminate; override;
    procedure SyncProc;
  public
  end;

var
  FormMain: TFormMain;
  MyThread: TMyThread;

implementation

{$R *.dfm}

procedure TFormMain.BStartClick(Sender: TObject);
begin
  MyThread := TMyThread.Create(True); // После создания поток остановлен
  MyThread.FreeOnTerminate := True; // После завершения работы поток "умрёт" сам
  MyThread.Resume; // Запуск потока
end;

procedure TMyThread.Execute;
var
  i2: Integer;
begin
  for i2 := 0 to 60 do
  begin
    if i2 > 61 then Break;
    Sleep(100);
    i := i2;
    Synchronize(SyncProc);
  end;
end;

procedure TMyThread.SyncProc;
begin
  FormMain.Caption := IntToStr(i);
end;

procedure TMyThread.DoTerminate;
begin
  // Что-то... Если нужно до вызова внешнего OnTerminate (если назначен)
  inherited;
  // Что-то... Если нужно после вызова внешнего OnTerminate (если назначен)
end;

procedure TFormMain.BCheckClick(Sender: TObject);
begin
  // Проверка на существование потока
  if MyThread <> nil then
  begin
    // Если поток умирает "мирно", штатно завершив работу
    if MyThread.Terminated then ShowMessage('Поток "MyThread" не работает') else ShowMessage('Поток "MyThread" работает');
  end else ShowMessage('Поток "MyThread" не создан');
end;
по завершению работы потока процедура проверки должна вывести "Поток "MyThread" работает"? Тогда получается, что поток висит в памяти.
Shouldercannon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросец по потокам stlcrash Общие вопросы Delphi 8 11.07.2016 19:36
При освобождении обьекта TThread, он вешает всю программу. При этом код Execute у TThread уж выполнился.. Человек_Борща Общие вопросы Delphi 23 30.11.2011 09:18
Вопрос по потокам Karamzda Общие вопросы C/C++ 1 17.11.2010 16:43
Вопрос по потокам mspavlyxa Помощь студентам 6 25.03.2010 23:46
Вопрос по потокам Eretic Общие вопросы по Java, Java SE, Kotlin 5 02.04.2009 00:17