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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 21.02.2015, 17:34   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Sleep останавливает выполнение всего в программе а не задерживает выполнение конкретного куска кода?

У меня имеются запущенные счетчики и во когда я делаю Sleep(5000); вся программа "висит" и счетчики ( они визуально у меня отображаются и уже включены до sleep()) не тикают эти 5 секунд.
Этого можно избежать или без этого никак?
Illusiony вне форума Ответить с цитированием
Старый 21.02.2015, 17:38   #2
Alex11223
Заблокирован
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Текущий поток он останавливает. Если вы выполняете его в UI потоке, то конечно весь UI зависнет.
Alex11223 вне форума Ответить с цитированием
Старый 21.02.2015, 17:44   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

А можно обойти эту проблему используя одноразовый таймер?
Illusiony вне форума Ответить с цитированием
Старый 21.02.2015, 17:49   #4
Alex11223
Заблокирован
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Ну например делать это в другом потоке (изучайте TThread).
Я правда не понял что вы сделать пытаетесь.

И вообще Sleep редко когда действительно нужен, обычно есть подходы получше.
Alex11223 вне форума Ответить с цитированием
Старый 21.02.2015, 18:04   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
Этого можно избежать или без этого никак?
Этого можно избежать безусловно )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2015, 20:20   #6
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Сделал через таймер, для моей задачи сойдет
Illusiony вне форума Ответить с цитированием
Старый 21.02.2015, 21:26   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Тогда от sleep откажись однозначно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2015, 21:37   #8
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Автор, тебе надо выполнение, пока не выполнится какое-либо условие?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 21.02.2015, 22:15   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,261
По умолчанию

Как всегда от меня самый ароматный говнокод:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    procedure Start;
    procedure Stop;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
  Beginning: Integer;

procedure FooSleep (milliseconds: Cardinal);
var
  c: Cardinal;
begin
  c := GetTickCount + milliseconds;
  while GetTickCount <= c do
    Application.ProcessMessages; // Пусть программа сделает то, что она должна сделать (обработает полученные события)
end;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := 'Прошло миллисекунд: ' + IntToStr (GetTickCount - Beginning);
end;

procedure TForm1.Start;
begin
  ShowMessage ('Начали');
  Beginning := GetTickCount;
  Timer1.Enabled := True;
end;

procedure TForm1.Stop;
begin
  Timer1.Enabled := False;
  ShowMessage ('Закончили');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Start;
  FooSleep (5000); // Здесь процедура Button1Click зависла, а программа нет.
  Stop;
end;

end.
Вообще, Illusiony, разберись с тем, как устроены события, что такое Application, ну и немного ознакомься с потоками. Глубоко лезть не нужно. Лично мне для своего прикладного уровня вполне хватает основ, чтобы не въезжать порой в такой вот пень.

P/S: Если программирование - твоё основное занятие, или хочешь связать с ним свою основную трудовую деятельность в будущем, и если это не проба пера - откажись от Sleep. Попробуй оформить отдельный поток. Давай. Смелей. Ты сможешь.

Последний раз редактировалось Sibedir; 21.02.2015 в 22:26.
Sibedir вне форума Ответить с цитированием
Старый 22.02.2015, 00:52   #10
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Sibedir, . Я как бы наверно потом WPF изучать буду, а сейчас нужно доделать пару программок, так что не буду в потоки углубляться.
саша40, просто нужно было задержать выполнение куска кода, но при этом не останавливать код включенных таймеров.
Illusiony вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение кода по адресу pufystyj Общие вопросы C/C++ 2 08.09.2012 19:47
Странное выполнение кода. Taler Общие вопросы C/C++ 15 04.04.2012 14:18
Выполнение PHP кода Sprat PHP 1 31.01.2012 14:12
Парсер, выполнение кода. zumm Общие вопросы Delphi 27 30.06.2010 12:29
Выполнение кода из файла.. NSvirus Паскаль, Turbo Pascal, PascalABC.NET 25 13.06.2009 23:56


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840