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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2011, 22:16   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Аватар, интересный вариант..
Сказал же что оба потока работают...

Вообще 1 поток запускает программу и мониторит её.. 2 ведёт отсчёт времени, и как только отсчитает заданные n ms, извещает 1 поток и закрывается.
1 поток получив извещение от второго, сворачивает программу за которой он закреплён.

Оба потока работают одновременно, но 2 поток зависит от первого(если первый закрывается, то второй уходит в накдаун тоже).
Код:
unit thread1;

uses thread2;
Код:
unit thread2;

uses thread1;

Последний раз редактировалось Человек_Борща; 20.09.2011 в 22:19.
Человек_Борща вне форума Ответить с цитированием
Старый 20.09.2011, 23:06   #12
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

А почему нельзя сделать отсчёт времени в первом потоки? Иногда проверять это время
TwiX вне форума Ответить с цитированием
Старый 20.09.2011, 23:18   #13
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

потому, что в потоке 1 есть много других вещей которыми он должен заниматься.
А таймер(TTimer) в потоке повесить не возможно.
Человек_Борща вне форума Ответить с цитированием
Старый 20.09.2011, 23:40   #14
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Как вариант (на Form1 есть Edit1, и да я знаю, что так нельзя задавать значение Edit'у):
Код:
unit Unit2;

interface

uses
  Classes,SyncObjs;

type
  TThread2 =class;
  TThread1 = class(TThread)
  private
    { Private declarations }
  protected
    childThread: TThread2;
    procedure Execute; override;
  end;

  TThread2 = class(TThread)
  private
    { Private declarations }
  protected
    TimeIsUp_: Boolean;
    function GetTimeIsUp: Boolean;
    Procedure SetTimeIsUp(Value: Boolean);
    procedure Execute; override;
  public
    cs: TCriticalSection;
    Property TimeIsUp: Boolean read GetTimeIsUp write SetTimeIsUp;
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy;
  end;

implementation

uses SysUtils, Unit1;


procedure TThread1.Execute;
begin
  childThread := TThread2.Create(false);
  try
    while true do
      if childThread.TimeIsUp then
      begin
        Form1.Edit1.Text := 'ss';
        break;
      end;
  finally
    FreeOnTerminate := true;
    childThread.Terminate;
  end;
end;

constructor TThread2.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate := false; //ñàìè ïðèáúåì åãî êîãäà íàäî áóäåò
  cs := TCriticalSection.Create;
  TimeIsUp_ := False;
end;

destructor TThread2.Destroy;
begin
  cs.Free;
end;

procedure TThread2.Execute;
begin
  TimeIsUp := False;
  sleep(5000);
  TimeIsUp := true;
end;

function TThread2.GetTimeIsUp: Boolean;
begin
  cs.Enter;
  try
    Result := TimeIsUp_;
  finally
    cs.Leave;
  end;
end;

procedure TThread2.SetTimeIsUp(Value: Boolean);
begin
  cs.Enter;
  try
    TimeIsUp_ := Value;
  finally
    cs.Leave;
  end;
end;

end.
ЗЫ
Когда и где создавать экземпляр класса TThread2 дело вкуса. И еще желательно почитать более подробно про TCriticalSection в хелпе — сдается мне я не слишком оптимально его применил... ну опять же повторюсь все зависит от конкретной задачи.. =)
Помог? Ну так нажми на весы!

Последний раз редактировалось SNUPY; 21.09.2011 в 00:30.
SNUPY вне форума Ответить с цитированием
Старый 20.09.2011, 23:59   #15
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Цитата:
Вообще 1 поток запускает программу и мониторит её.. 2 ведёт отсчёт времени, и как только отсчитает заданные n ms, извещает 1 поток и закрывается.
1 поток получив извещение от второго, сворачивает программу за которой он закреплён.
У вас одновременно работают несколько потоков_1, каждый из которых мониторит свою программу?
Если так, можно использовать вместо ненужных потоков_2 простые таймеры: SetTimer/KillTimer. Уведомлять потоки_1 можно, как вам уже сказали, через массив переменных. А еще лучше сворачивать нужную программу прямо в обработчике таймера.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 21.09.2011, 00:00   #16
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
потому, что в потоке 1 есть много других вещей которыми он должен заниматься.
А таймер(TTimer) в потоке повесить не возможно.
Когда-то же он должен проверять, работает еще первый поток или нет.
А если вы время в потоке отсчитываете с помощью таймера, то это печаль...
TwiX вне форума Ответить с цитированием
Старый 21.09.2011, 00:16   #17
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
А если вы время в потоке отсчитываете с помощью таймера, то это печаль...
был бы рад =) Но TTimer в потоке не возможен.
Человек_Борща вне форума Ответить с цитированием
Старый 21.09.2011, 00:23   #18
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Цитата:
Но TTimer в потоке не возможен.
Я уже написал выше: попробуйте SetTimer/KillTimer.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 21.09.2011, 00:46   #19
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Таймер в потоке(TThread) возможен...
Вот, пожалуйста:
Код:
TMyThread = class(TThread)
  private
    tDone: boolean;
    timer: TTimer;
    procedure MyOnTimer(Sender: TObject);
    procedure Execute; override;
  public
    constructor Create;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

constructor TMyThread.Create;
begin
  timer:=TTimer.Create(nil);
  timer.OnTimer:=MyOnTimer;
  timer.Interval:=1000;
  timer.Enabled:=false;
  inherited Create(false);
end;

procedure TMyThread.Execute;
begin
  tDone:=False;
  Form1.ListBox1.Items.Insert(0, 'Executing...');

  timer.Enabled:=true;
  while not tDone do
    Sleep(10);
  Form1.ListBox1.Items.Insert(0, 'Timer has just alarmed. Terminating...');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TMyThread.Create();
end;

procedure TMyThread.MyOnTimer(Sender: TObject);
begin
  tDone:=true;
end;
TwiX вне форума Ответить с цитированием
Старый 21.09.2011, 14:22   #20
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Вообще 1 поток запускает программу и мониторит её.. 2 ведёт отсчёт времени, и как только отсчитает заданные n ms, извещает 1 поток и закрывается.
Зачем нужен таймер если можно просто использовать системное время. Now() Time().

при запуске отмечаем время (время запуска).
Во время мониторинга определяем разницу (текущее время . время запуска).
Как только >= то ....

P.S. подразумевается что мониторинг есть некий циклический процесс (while ....).
Вместо времени запуска можно сразу рассчитать Контрольное время( время завершения) и контролировать его наступление.

Цитата:
.. 2 ведёт отсчёт времени, и как только отсчитает заданные n ms,
если ему не хватит процессора, то он возможно никогда не отсчитает.
Цитата:
что в потоке 1 есть много других вещей которыми он должен заниматься.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.09.2011 в 14:40.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событие в потоке filin2323 C# (си шарп) 4 20.07.2011 22:14
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Как приостаносить поток до события в другом потоке Sionus Помощь студентам 2 30.03.2010 21:51
Как оповестить основной поток о каком-то событии в потоке (TThread)? TwiX Общие вопросы Delphi 2 11.02.2010 02:57
TClientSocket в потоке BlackOmen Работа с сетью в Delphi 8 27.04.2008 22:19