Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задержка потока 
V
    Опции темы
NoliX
Дата 18.1.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Товарищи, подскажите, как сделать задержку в потоке, я весь форум перерыл, подходящего ничего не нашел...

Сразу оговорюсь такой цикл мне не подходит....

Код

FirstTickCount := GetTickCount64;
  repeat
    Application.ProcessMessages;
//     allowing access to other controls, etc.
    Now := GetTickCount64;
  until (Now - FirstTickCount >= MSecs);


Ttimer тоже не подходит, и sleep не подходит...

В общем суть задачи состоит в том, что необходимо приостановить работу потока из самого потока на n секунд, при этом основное приложение должно нормально работать... (sleep был бы идеален если бы не тормозил всю программу...)

В общем скажите кто, что знает...
Добавлено @ 20:00
ага, так, sleep тормозит поток если у него нету синхронизации, а с синхронизацией как задержку поставить?
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



NoliX

Если у тебя несколько потоков, то Sleep приостанавливает выполнение только того потока, в котором выполняется Sleep.
Опиши понятнее, что ты хочешь сделать.
Добавлено @ 20:10
PS. Не понял, зачем в WINAPI тему? smile


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



упс, пардон, темой промахнулся....
Итак есть 2 формы, есть поток, поток вызывается с первой формы и выполняет действия с периодичность в несколько секунд, после того как поток закончил свое черное дело первая форма прячется и появляется вторая форма

Тут 2 подводных камня:
1. Если вызвать поток без синхронизации, то вторая форма не открывается, пишет ошибку, что не верный дескриптор окна
2.Если использовать синхронизацию, то sleep находящийся в потоке подвешивает программу


Вопрос: Что делать?
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
_hunter
Дата 18.1.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а почему бы не открывать вторую форму из потока?
+ стандартные методы извещения никто не отменял: после завершения работы потока шли главной форме сообщение, по которому она будет показывать вторую форму.
можно еще и событие прикрутить ( но с сообщением будет по-проще )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NoliX
Дата 18.1.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



ну вот и хочу открыть вторую форму из потока, а она не хочет открываться без синхронизации, а сообщения программе слать я не умею, можно пример?
Добавлено @ 20:43
мне нужно провести вот такие операции
Код

form5.label4.Caption:=IntToStr(z);
form5.label5.Caption:=IntToStr(z1);
form5.label6.Caption:=IntToStr(k1);
form5.label8.Caption:=PChar(TimeToStr(Now));
form5.label9.Caption:=TimeToStr(DateTimeToUnix(now) - pk);
Form4.label7.Caption:='Все сообщения отправлены';
Form4.Memo1.Lines.Add(DateTimeToStr(Now) + ': Все сообщения отправлены');
Form5.Memo1.Text:=Form4.Memo1.Text;
Form5.Show;
Form4.Hide;


первой формой является form4 второй form5
Добавлено @ 20:43
PS это не весь поток =)
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Из дополнительного потока не создавай формы.

Метод может быть таким:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TMyThread=class(TThread)
  private
    procedure Display;
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Display;
begin
  Form1.Hide;
  Form2.Show;
end;

procedure TMyThread.Execute;
begin
  //Что-то делаем
  Sleep(3000);  //эмуляция работы
  Synchronize(Display);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Thr: TMyThread;
begin
  Thr := TMyThread.Create(True);
  Thr.FreeOnTerminate := True;
  Thr.Resume;
end;

end.




Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Show;
end;

end.




--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Демо, все бы хорошо, так я уже пробывал делать, но вот низадача, данные которые мне нужно передать являются локальми переменными процедуры, если выносить в отдельную процедуру вывод в форму2 то нужно это процеду с параметрами объявлять, а он отказывается синхронизировать такую процедуру или я туплю просто...
Добавлено @ 21:12
просто в этом случае приходится переменные глобализировать, а этого не хотелось бы, кстати понравилась идея с извещениями, но как ее реализовать?
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(NoliX @ 18.1.2006, 22:08 Найти цитируемый пост)

анные которые мне нужно передать являются локальми переменными процедуры


Какой процедуры? Где она выполняется?


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



у меня поток отдельным юнитом создан, в этом потоке процедура поток.Execute, в ней все и происходит
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(NoliX @ 18.1.2006, 22:32 Найти цитируемый пост)

у меня поток отдельным юнитом создан, в этом потоке процедура поток.Execute, в ней все и происходит


Так процедура у тебя выполняется в потоке? Почему не используешь переменные потока?

Вот как раз сейчас пишу для себя задачу, посмотри пример. Спецю для тебя добавил временно поле в поток - FTestCounter

Код

unit ufMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uThreads;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Thr: TCountThread;

implementation

{$R *.dfm}

procedure Exec(Sender: TObject);
var
  Th: TCountThread;
  dt: TDateTime;
begin
    
  Th := TCountThread(Sender);
//Здесь работаем с любыми параметрами потока.
//Но в этой процедуре нельзя обращаться без синхронизации к раздельным ресурсам без Synchronize
  Th.Counter := 0;
  dt := Now;

  while Now-dt<0.00002 do
  begin
    Th.Counter := Th.Counter + 1;
  end;
end;

procedure OnEnd(Sender: TObject; var FreeThr: Boolean);
begin
//Снова работаем с полями
//Но эта процедура уже потокобезопасна. Здесь можно работать с VCL(например, как ты хотел, с формами)
  ShowMessage(IntToStr(TCountThread(Sender).Counter));
  FreeThr := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Thr := TCountThread.Create;
  Thr.ThrProc := Exec;
  Thr.OnComplete := OnEnd;
  Thr.Resume;
end;

end.



Код

unit uThreads;

interface

uses
  Classes, SysUtils;

type

  TCompleteProc=procedure(Sender: TObject; var FreeThr: Boolean);
  TThrProc=procedure(Sender: Tobject);

  TCountThread=class(Tthread)
  private
    FTestCounter: Integer;
    FOnComplete: TCompleteProc;
    FThrProc: TThrProc;
    procedure FComplete;
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;

    property ThrProc: TThrProc read FThrProc write FThrProc;
    property OnComplete: TCompleteProc read FOnComplete write FOnComplete;
    property Counter: Integer read FTestCounter write FTestCounter;
  end;


implementation

{ TCountThread }

constructor TCountThread.Create;
begin
  inherited Create(True);
end;

destructor TCountThread.Destroy;
begin
  inherited;
end;

procedure TCountThread.Execute;
begin
  if Assigned(FThrProc) then FThrProc(Self);
  Synchronize(FComplete);
end;

procedure TCountThread.FComplete;
var
  FreeThr: Boolean;
begin
  FreeThr := False;
  if Assigned(FOnComplete) then FOnComplete(Self,FreeThr);
  if FreeThr then FreeOnTerminate := True;
end;

end.



Это сообщение отредактировал(а) Демо - 18.1.2006, 22:05


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



так щас посмотрю подходил ли мне такая штука, спасибо
в общем и целом содержимое потока (по порядку)

Подсчет данных (создание массивов их заполнение вычисление чисел)
Начало цикла
всякие операции
ЗАДЕРЖКА
вывод информации на форму 2 (с использованием переменных потока)
операции опять
конец цикла
вывод информации на форму 2 (с использованием переменных потока)
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



вывод информации на форму 2 (с использованием переменных потока) - Synchronyze(Procedure1)
операции опять
конец цикла
вывод информации на форму 2 (с использованием переменных потока) - Synchronyze(Procedure2) или снова Synchronyze(Procedure1)


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



на синхронизации зависает теперь и все хмм, буду думать дальше...
и все таки, можно програмно попросить из потока программу выполнить некоторые функции
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(NoliX @ 18.1.2006, 23:41 Найти цитируемый пост)

и все таки, можно програмно попросить из потока программу выполнить некоторые функции


Из потока, как и из любой другой функции, можно вызвать на выполнение любую функцию или процедуру...


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



да нет, я не об этом, я вот об этом
Код

+ стандартные методы извещения никто не отменял:
 после завершения работы потока шли главной форме сообщение,
 по которому она будет показывать вторую форму.


Это сообщение отредактировал(а) NoliX - 18.1.2006, 23:23
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.