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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2014, 13:24   #21
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от dbGo Посмотреть сообщение
Вопрос не в потоке, и без него нормально. Вопрос как закрыть форму, при запущенном цикле в таймере!
У вас гибрид получился. Конечно, он не имеет смысла. Поток не должен вызывать ProcessMessages, а таймер должен быть уничтожен =-)
Вот например один из миллиона вариантов код потока, просто обозначаю идею:
Код:
 NextWork := 0;
 while not FTerminated do begin
    GlobalTime = GetTickCount();
    if (GlobalTime > NextWork) then begin
          ... some code ...
          NextWork := GetTickCount() + TimerDelay;
    end;
 end;
StriderX вне форума Ответить с цитированием
Старый 17.09.2014, 14:52   #22
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
Подмигивание

Слабал я тебе пример.

Отлаживал только в Delphi 7 и только под windows 8.1x64.
Вложения
Тип файла: rar 265557.RAR (183.5 Кб, 8 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 14:54   #23
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Кому влом качать - вот кусок кода.
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Gauges, Spin;

type
  TMainForm = class(TForm)
    Timer: TTimer;
    BackPanel: TPanel;
    ModalButton: TButton;
    TimerGroupBox: TGroupBox;
    StartButton: TButton;
    Gauge: TGauge;
    Label1: TLabel;
    CountSpinEdit: TSpinEdit;
    procedure TimerTimer(Sender: TObject);
    procedure ThreadTerminate(Sender: TObject);
    procedure StartButtonClick(Sender: TObject);
    procedure ModalButtonClick(Sender: TObject);
  private
    FThread: TThread;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override; 
  end;

type
  TMyThread = class(TThread)
  private
    FForm: TMainForm;
    FProgress: Integer; 
    procedure UpdateInfo;
  protected
    procedure Execute; override;
  public
    constructor Create(const CreateSuspended: Boolean; AForm: TMainForm); reintroduce;
  end;  

var
  MainForm: TMainForm;

implementation

uses
  uModal;

{$R *.dfm}

procedure TMainForm.ThreadTerminate(Sender: TObject);
begin
  FThread:= nil;
  Gauge.Progress:= 0;
end;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
  if Assigned(FThread)
    then Exit;
    
  Timer.Enabled:= False;
  FThread:= TMyThread.Create(True, Self);
  FThread.OnTerminate:= ThreadTerminate;
  
  try
    FThread.Resume();
  finally
    Timer.Enabled:= True;
  end;  
end; 

procedure TMainForm.StartButtonClick(Sender: TObject);
begin
  Timer.Enabled:= not Timer.Enabled;

  if Timer.Enabled
    then begin
           StartButton.Caption:= 'Ñòîï';
           TimerTimer(Timer);
         end  
    else begin
           if Assigned(FThread)
             then FThread.Terminate();

           StartButton.Caption:= 'Ñòàðò';
         end;  

  Self.Invalidate();
end;

constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited;
  TimerGroupBox.DoubleBuffered:= True;
end;

destructor TMainForm.Destroy;
begin
  if Assigned(FThread) and not FThread.Suspended
    then FThread.Terminate();
    
  inherited;
end;

{ TMyThread }

constructor TMyThread.Create(const CreateSuspended: Boolean; AForm: TMainForm);
begin
  inherited Create(CreateSuspended);
  FForm:= AForm;
end;

procedure TMyThread.Execute;
var
  i, Count: Integer;
begin
  if Assigned(FForm)
    then Count:= FForm.CountSpinEdit.Value
    else Count:= 100500;
  
  for i:= 0 to Count - 1 do
    begin
      if Self.Terminated
        then Break;
    
      FProgress:= Round(100.0 * (i + 1) / Count);
      Synchronize(UpdateInfo);
    end;
end; 

procedure TMyThread.UpdateInfo;
begin
  if not Assigned(FForm)
    then Exit;

  FForm.Caption:= IntToStr(FProgress) + '% ' + TimeToStr(Now());
  FForm.Gauge.Progress:= FProgress;
end;

procedure TMainForm.ModalButtonClick(Sender: TObject);
begin
  ShowModalForm();
end;

end.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 14:57   #24
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
Восклицание

Спасибо, за пример!
dbGo вне форума Ответить с цитированием
Старый 17.09.2014, 15:14   #25
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Спасибо, за пример!
Чо, работает?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 16:01   #26
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию

Код работает, спасибо. Но у меня возникли технические вопросы по реализации вашего метода, а именно создание потока. Я написал вам в ICQ, но там анти-бот...
Разъясните процедуру
Код:
 inherited Create(CreateSuspended);
Я правильно понимаю, что ошибка была в том, что я стопорил таймер и не отпускал его пока не отработает цикл внутри него?

Последний раз редактировалось dbGo; 17.09.2014 в 16:04.
dbGo вне форума Ответить с цитированием
Старый 17.09.2014, 16:30   #27
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
Сообщение

Цитата:
Я написал вам в ICQ, но там анти-бот...
Дай свой UIN, я сам постучуся...
Цитата:
Разъясните процедуру
Это конструктор треда. Чо тут непонятно?
Цитата:
Я правильно понимаю, что ошибка была в том, что я стопорил таймер и не отпускал его пока не отработает цикл внутри него?
Не совсем. Просто ты не совсем понимаешь, как windows работает на уровне сообщений и тредов.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 17:10   #28
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию

я через мэйл агент вас нашел.
Мой емайл pssolo@bk.ru можете писать прямо на него или прислать скайп на мэйл.
dbGo вне форума Ответить с цитированием
Старый 17.09.2014, 17:45   #29
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
я через мэйл агент вас нашел.
Мой емайл pssolo@bk.ru можете писать прямо на него или прислать скайп на мэйл.
Да ну, влом. Пиши на аську. И ваще, чо там у тебя за вопросы-то?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймеры tools Qt и кроссплатформенное программирование С/С++ 3 30.05.2010 23:12
Таймеры Sergeu Общие вопросы C/C++ 2 25.03.2010 12:13
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12